【问题标题】:Jest & Enzyme | Received value must be a function, received undefined笑话和酶 |接收到的值必须是函数,接收到未定义
【发布时间】:2019-04-04 13:47:56
【问题描述】:

我有一个小功能,用于检查用户名是否唯一。见下文:

export const validateUsername = value =>
  listUsers({ once: true }).then(({ data }) => {
    if (Array.isArray(data) && data.find(userData => userData.username === value)) {
      // eslint-disable-next-line no-throw-literal
      throw 'Username already exists';
    }
  });

我想为它写一些测试。但是我得到了这个错误

Received value must be a function, but instead "undefined" was found

你能向我解释什么是错的吗?我的意思是,这是一个异步函数,当时它是未定义的,但不确定它要我做什么。

  it('Accept the data if the passed userName is unique', async () => {
    expect(await validateUsername('Username is unique')).not.toThrow();
  });

【问题讨论】:

  • 如果你使用toThrow,你必须将一个函数传递给expect
  • 所以,如果我说validateUsernamefn = jest.fn();,我说beforeEach(() => {validateUsername = validateUsernameFn},这行得通吗?我正在从索引文件中导入 validateusername。
  • 你知道,我这样做了,它似乎正在工作:` it('如果传递的用户名是唯一的,则接受数据',async () => { expect(() => validateUsername('用户名是唯一的')).not.toThrow(); });`这对你来说正确吗?
  • 是的,我就是这个意思。
  • 实际上这种方法不起作用,因为调用validateUsername never 会抛出一个Error,它会返回一个Promise,它可能会用Error 拒绝,所以即使Error 被抛出并且Promise 被拒绝,该测试也将始终通过。相反,您需要测试返回的Promise...请参阅下面的答案

标签: reactjs unit-testing async-await jestjs enzyme


【解决方案1】:

validateUsername 返回一个Promise,可以用Error 拒绝...

...所以按预期测试返回的Promise.resolves 还是.rejects

const listUsers = async() => Promise.resolve({data: [{ username: 'existing username' }]});

export const validateUsername = value =>
  listUsers({ once: true }).then(({ data }) => {
    if (Array.isArray(data) && data.find(userData => userData.username === value)) {
      // eslint-disable-next-line no-throw-literal
      throw new Error('Username already exists');  // <= throw an Error instead of just a string
    }
  });

it('Accept the data if the passed userName is unique', async () => {
  await expect(validateUsername('Username is unique')).resolves.not.toThrow();  // Success!
});

it('throws error if username already exists', async () => {
  await expect(validateUsername('existing username')).rejects.toThrow('Username already exists');  // Success!
});

(请注意,您需要抛出一个Error 而不仅仅是一个字符串来使用toThrow 检查其消息)

【讨论】:

  • 实际上,效果非常好,而且对我来说更干净。
猜你喜欢
  • 2022-12-09
  • 1970-01-01
  • 2014-05-19
  • 2020-09-08
  • 2020-09-16
  • 2021-03-10
  • 1970-01-01
  • 2018-02-23
  • 2019-10-01
相关资源
最近更新 更多