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;}事实上,效果非常好,我这边更干净。事实上,效果非常好,我这边更干净。