【问题标题】:Mock vs Import Then Mock模拟与导入然后模拟
【发布时间】:2020-11-29 07:19:27
【问题描述】:

我试图了解什么时候可以只导入模拟,什么时候需要导入模拟并在测试文件中仍然使用jest.mock。我正在查看来自 Jest 的 Github 的 manual-mocks example

一步模块模拟

在 Lodash 测试中,Lodash is mocked__mocks__ 目录中使用 createMockFromModule,导出,并且只是 imported using the standard module import and used directly in the test(没有额外的模拟)。

两步模拟

在同一个项目中,User model is exportedseparate User mock file。但是在User mocked test 中,用户被导入但是还有一个额外的步骤使用jest.mock('../models/user');

我的问题/困惑

为什么 Lodash 测试不需要测试文件中的额外 jest.mock,或者为什么用户测试需要它?在项目中,似乎我可以同时测试 actualmocked 用户实现,但 Lodash 只会使用 mocked 实现,即使两者在__mocks__ 目录中使用createMockFromModule 创建/导出。

【问题讨论】:

  • 考虑在问题中提供相关的 sn-ps,尤其是因为它们很小。这个问题应该是完全可以理解的,而不需要导航到可能变得不可用的外部资源。

标签: javascript mocking jestjs


【解决方案1】:

区别在于lodash是Node模块,user是本地模块,后者需要jest.mock('../models/user')才能使用来自__mocks__的mock。

正如the documentation 所说,

如果您要模拟的模块是 Node 模块(例如:lodash),则模拟应放置在与 node_modules 相邻的 __mocks__ 目录中(除非您将根配置为指向项目根以外的文件夹) 并且会被自动模拟。无需显式调用jest.mock('module_name')

警告:如果我们想模拟 Node 的核心模块(例如:fspath),那么显式调用例如jest.mock('path') 是必需的,因为默认情况下不模拟核心 Node 模块。

这可以避免 NPM 包的模拟与同名的本地模块之间发生意外冲突。

【讨论】:

  • 明白了。这就说得通了。我很感激!
猜你喜欢
  • 1970-01-01
  • 2015-12-14
  • 2020-06-30
  • 2011-11-09
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多