如何使用 Jest 监视默认导出函数?

新手上路,请多包涵

假设我有一个导出默认函数的简单文件:

 // UniqueIdGenerator.js
const uniqueIdGenerator = () => Math.random().toString(36).substring(2, 8);

export default uniqueIdGenerator;

我会这样使用:

 import uniqueIdGenerator from './UniqueIdGenerator';
// ...
uniqueIdGenerator();

我想在我的测试中断言这个方法是在保持原始功能的同时被调用的。我会用 jest.spyOn 但是,它需要一个对象和一个函数名作为参数。你怎么能以干净的方式做到这一点?对于任何感兴趣的人, jasmine 都有一个类似的 GitHub 问题

原文由 thisismydesign 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 919
2 个回答

我最终放弃了默认导出:

 // UniqueIdGenerator.js
export const uniqueIdGenerator = () => Math.random().toString(36).substring(2, 8);

然后我可以像这样使用和监视它:

 import * as UniqueIdGenerator from './UniqueIdGenerator';
// ...
const spy = jest.spyOn(UniqueIdGenerator, 'uniqueIdGenerator');

有些人建议 将它们包装在一个 const 对象中,然后将其导出。我想您也可以使用一个类进行包装。

但是,如果您无法修改课程,仍然有一个(不太好的)解决方案:

 import * as UniqueIdGenerator from './UniqueIdGenerator';
// ...
const spy = jest.spyOn(UniqueIdGenerator, 'default');

原文由 thisismydesign 发布,翻译遵循 CC BY-SA 4.0 许可协议

还可以模拟导入并将原始实现作为模拟实现传递,例如:

 import uniqueIdGenerator from './UniqueIdGenerator'; // this import is a mock already

jest.mock('./UniqueIdGenerator.js', () => {
  const original = jest. requireActual('./UniqueIdGenerator')
  return {
     __esModule: true,
     default: jest.fn(original.default)
  }
})

test(() => {
  expect(uniqueIdGenerator).toHaveBeenCalled()
})

原文由 alex.spri 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进