Reactjs Jest&Ezyme |接收值必须是函数,未定义接收值

Reactjs Jest&Ezyme |接收值必须是函数,未定义接收值,reactjs,unit-testing,async-await,jestjs,enzyme,Reactjs,Unit Testing,Async Await,Jestjs,Enzyme,我有一个小功能,检查用户名是否唯一。见下文: export const validateUsername = value => listUsers({ once: true }).then(({ data }) => { if (Array.isArray(data) && data.find(userData => userData.username === value)) { // eslint-disable-next-line n

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

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();
  });
validateUsername返回一个承诺,该承诺可能会因错误而拒绝

…因此,测试返回的承诺是否符合预期:

const listUsers=async=>Promise.resolve{data:[{username:'existing username'}]}; export const validateUsername=值=> listUsers{once:true}。然后{data}=>{ 如果Array.isArraydata&&data.finduserData=>userData.username==value{ //eslint禁用下一行无抛出文字 抛出新错误“用户名已存在”;//{ 等待expectvalidateUsername“用户名是唯一的”。resolves.not.toThrow;//成功! }; 它“如果用户名已经存在,则抛出错误”,异步=>{ 等待expectvalidateUsername“现有用户名”。拒绝。提示“用户名已存在”;//成功! }; 请注意,您需要抛出一个错误,而不仅仅是一个字符串来检查消息,validateUsername返回一个承诺,该承诺可能会被错误拒绝

…因此,测试返回的承诺是否符合预期:

const listUsers=async=>Promise.resolve{data:[{username:'existing username'}]}; export const validateUsername=值=> listUsers{once:true}。然后{data}=>{ 如果Array.isArraydata&&data.finduserData=>userData.username==value{ //eslint禁用下一行无抛出文字 抛出新错误“用户名已存在”;//{ 等待expectvalidateUsername“用户名是唯一的”。resolves.not.toThrow;//成功! }; 它“如果用户名已经存在,则抛出错误”,异步=>{ 等待expectvalidateUsername“现有用户名”。拒绝。提示“用户名已存在”;//成功! };
请注意,如果使用toThrow,则需要抛出一个错误,而不仅仅是一个字符串来检查其消息。因此,如果我说validateUsernamefn=jest.fn;,我说beforeach=>{validateUsername=validateUsernamefn},那么,这将起作用。我正在从索引文件导入validateusername。正如您所知,我这样做了,它似乎起作用了:`it'如果传递的用户名是唯一的,则接受数据',async=>{expect=>validateusername'userName是唯一的'。not.toThrow;}如果要使用toThrow,则必须传递一个函数来预期。因此,如果我说validateUsernamefn=jest.fn;,我说beforeach=>{validateUsername=validateUsernamefn},这将起作用。我正在从索引文件导入validateusername。正如您所知,我这样做了,它似乎起作用了:`it'如果传递的用户名是唯一的,则接受数据',async=>{expect=>validateusername'userName是唯一的'。not.toThrow;}事实上,效果非常好,我这边更干净。事实上,效果非常好,我这边更干净。