Javascript Jest Mock返回未定义的数据,而不是未定义的数据
我试图模拟一个函数,但不确定我在这里做错了什么。我有一个函数“getGroups” 获取组:Javascript Jest Mock返回未定义的数据,而不是未定义的数据,javascript,jestjs,Javascript,Jestjs,我试图模拟一个函数,但不确定我在这里做错了什么。我有一个函数“getGroups” 获取组: export const getGroups = async () => { try { const groupApiUrl = getDashboardPath(GROUPS_TAB_INDEX); const data = await fetch(groupApiUrl, { cache: 'force-cache' }); const userData = awa
export const getGroups = async () => {
try {
const groupApiUrl = getDashboardPath(GROUPS_TAB_INDEX);
const data = await fetch(groupApiUrl, { cache: 'force-cache' });
const userData = await data.json();
return userData;
} catch (error) {
throw Error(error);
}
};
___mocks__;/getGroups.js:
export default async () => {
return {
groups: [
{ id: 1, name: 'Data1' },
{ id: 2, name: 'Data2' }
]
};
};
getGroups.test.js:
jest.mock('./getGroups.js');
// eslint-disable-next-line import/first
import { getGroups } from './getGroups';
const fakeRespose = {
groups: [
{ id: 1, name: 'Data1' },
{ id: 2, name: 'Data2' }
]
};
describe('getGroups', () => {
it('returns data', async () => {
const data = await getGroups();
console.log('DATA', data); <---- UNDEFINED?
expect(data).toBeDefined();
expect(data).toMatchObject(fakeRespose);
});
it('handles error', async () => {
// const data = await getGroups();
await getGroups().toThrow('Failed');
});
});
jest.mock('./getGroups.js');
//eslint禁用下一行导入/第一行
从“/getGroups”导入{getGroups};
常数fakeRespose={
小组:[
{id:1,名称:'Data1'},
{id:2,名称:'Data2'}
]
};
描述('getGroups',()=>{
它('返回数据',异步()=>{
const data=wait getGroups();
console.log('DATA',DATA){
//const data=wait getGroups();
等待getGroups().toThrow('Failed');
});
});
来自Jest文档,这里是一个模拟的示例
jest.mock('../moduleName', () => {
return jest.fn(() => 42);
});
// This runs the function specified as second argument to `jest.mock`.
const moduleName = require('../moduleName');
moduleName(); // Will return '42';
在您的情况下,数据
是未定义的,因为您实际上没有为函数提供模拟实现,或者模拟没有工作,您仍然在调用原始函数
示例参考:
但是,在您的简单情况下,您也可以使用间谍来解决此问题,可以是jest.spyOn
或jest.fn()
。以下是两种解决方案,您可以在此处查看代码并运行它:
评论后更新:
手动模拟是通过在\uuuuu mock\uuu/
紧靠模块的子目录。例如,to mock
在models目录中,创建一个名为user的文件
并将其放入models/\uuuu mocks\uuu
目录中
\uuuuuuuu mocks\uuuu
文件夹区分大小写,因此在某些系统上命名目录将中断
仔细检查已设置的导出的命名、目录结构和类型-它们应该匹配。此外,值得检查:-这似乎是jest的一个公开问题。如果需要解决方案,请使用我提到的其他方法
参考资料:来自Jest文档,这里是一个模拟示例
jest.mock('../moduleName', () => {
return jest.fn(() => 42);
});
// This runs the function specified as second argument to `jest.mock`.
const moduleName = require('../moduleName');
moduleName(); // Will return '42';
在您的情况下,数据
是未定义的,因为您实际上没有为函数提供模拟实现,或者模拟没有工作,您仍然在调用原始函数
示例参考:
但是,在您的简单情况下,您也可以使用间谍来解决此问题,可以是jest.spyOn
或jest.fn()
。以下是两种解决方案,您可以在此处查看代码并运行它:
评论后更新:
手动模拟是通过在\uuuuu mock\uuu/
紧靠模块的子目录。例如,to mock
在models目录中,创建一个名为user的文件
并将其放入models/\uuuu mocks\uuu
目录中
\uuuuuuuu mocks\uuuu
文件夹区分大小写,因此在某些系统上命名目录将中断
仔细检查已设置的导出的命名、目录结构和类型-它们应该匹配。此外,值得检查:-这似乎是jest的一个公开问题。如果需要解决方案,请使用我提到的其他方法
参考资料:您在这里做错了什么?
{getGroups}
,因此要使其工作,您需要像这样更改您的模拟
\uuuu mocks\uuuu\getGroups.js
export const getGroups=async()=>{
返回{
小组:[
{id:1,名称:'Data1'},
{id:2,名称:'Data2'}
]
};
};
太长,读不下去了
jest.fn()
,并将保留常量,允许您更改某些测试用例的返回值/实现,并且如果调用了函数,还可以编写断言\uuuu mocks\uuuu\getGroups.js
const mock=jest.genMockFromModule('../getGroups');
mock.getGroups.mockResolvedValue({
小组:[
{id:1,名称:'Data1'},
{id:2,名称:'Data2'}
]
})
module.exports=mock;
因此,您可以先安全地保留导入语句,然后调用
jest.mock
您在这里做错了什么?
{getGroups}
,因此要使其工作,您需要像这样更改您的模拟
\uuuu mocks\uuuu\getGroups.js
export const getGroups=async()=>{
返回{
小组:[
{id:1,名称:'Data1'},
{id:2,名称:'Data2'}
]
};
};
太长,读不下去了
jest.fn()
,并将保留常量,允许您更改某些测试用例的返回值/实现,并且如果调用了函数,还可以编写断言\uuuu mocks\uuuu\getGroups.js
const mock=jest.genMockFromModule('../getGroups');
mock.getGroups.mockResolvedValue({
小组:[
{id:1,名称:'Data1'},
{id:2,名称:'Data2'