Javascript Jest Mock返回未定义的数据,而不是未定义的数据

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

我试图模拟一个函数,但不确定我在这里做错了什么。我有一个函数“getGroups”

获取组:

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将自动提升Jest.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'