【发布时间】:2020-08-07 18:03:41
【问题描述】:
TL;DR
我希望启用某种automock 功能,但仅(并且仅!)我在相应__mocks__ 文件夹中明确定义的模块。在 Jest 中有没有办法做到这一点?
也欢迎一般的意见和建议。
一点上下文: (可选)
原来我完全误解了 Jests automock 功能。顺便说一句,现在回想起来,我不明白为什么,因为文档非常清楚它的实际作用:
这个选项告诉 Jest 你的测试中所有导入的模块应该被自动模拟。
好像我刚刚注意到 ALL 关键字。也许我只是在想 - 但即使对于我实际上要在这里测试的导入函数,拥有一个 automock 也是没有意义的,不是吗?显然我想从node_modules 自动模拟第三方的东西,但不是我自己的代码。事实证明:
注意:节点模块会在您手动模拟时自动模拟(例如:
__mocks__/lodash.js)。注意:核心模块,如 fs,默认情况下不会模拟。它们可以被明确地模拟,例如
jest.mock('fs')
所以这与我认为的相反。
【问题讨论】:
-
您想要的是开箱即用的 Jest 中的默认值,而不改变其行为。至少对于 create-react-app 它的行为方式是这样的。
-
您的意思是在 CRA 中,如果您为给定模块创建一个 mock 并将其放在
__mocks__中,它将自动被包含而不是原始模块,无需任何额外配置? -
@timotgl 你有没有在实践中尝试过,或者这只是一个假设?你可以链接相应的文档吗?因为这里绝对不是这样的。
-
我想你和我一样误解了这个功能——来自
__mocks__的模块不会被自动拾取,需要明确调用jest.mock('module_name')才能被拾取。这里有一个专门的警告:jestjs.io/docs/en/manual-mocks#mocking-user-modules -
是的,你是对的@jayarijo,我忘记了手动 jest.mock 调用。我和你一样一无所知:D 然而,你可以做的是有一个 index.js 在你自己的所有模拟上调用 jest.mock ,然后在每次测试中只导入这个“模拟加载器”一次,而不是列出所有每次的模块。
标签: javascript typescript unit-testing jestjs automocking