Javascript Jest:automock模块,但仅限于_mock中定义的模块,而不是所有模块

Javascript Jest:automock模块,但仅限于_mock中定义的模块,而不是所有模块,javascript,typescript,unit-testing,jestjs,automocking,Javascript,Typescript,Unit Testing,Jestjs,Automocking,TL;DR 我希望启用某种类型的automock功能,但仅适用于(且仅适用于!)我在相应的\uuuuuumocks\uuuu文件夹中明确定义的模块。开玩笑有什么办法吗 欢迎提出一般性意见和建议 一点背景:(可选) 原来我完全误解了笑话的特点。顺便说一句,现在回想起来,我不明白为什么,因为文档非常清楚它的实际功能: 此选项告诉Jest,测试中导入的所有模块都应自动模拟 好像我刚刚注意到了所有关键字。也许我只是在想,但是即使对于我要在这里测试的导入函数,使用automock也没有意义,是吗?很明显,

TL;DR

我希望启用某种类型的
automock
功能,但仅适用于(且仅适用于!)我在相应的
\uuuuuumocks\uuuu
文件夹中明确定义的模块。开玩笑有什么办法吗

欢迎提出一般性意见和建议

一点背景:(可选)

原来我完全误解了笑话的特点。顺便说一句,现在回想起来,我不明白为什么,因为文档非常清楚它的实际功能:

此选项告诉Jest,测试中导入的所有模块都应自动模拟

好像我刚刚注意到了所有关键字。也许我只是在想,但是即使对于我要在这里测试的导入函数,使用automock也没有意义,是吗?很明显,我想自动模拟来自
node\u modules
的第三方内容,但不是我自己的代码。结果证明:

注意:当手动模拟到位时(例如:
\uuuuuumocks\uuuuu/lodash.js
),节点模块将自动模拟

注意:核心模块,如fs,默认情况下不模拟。可以显式地模拟它们,如
jest.mock('fs')


因此,这与我所认为的正好相反。

如果我理解正确,您的
\uuuumocks\uuuuuuu
文件夹中有某些模拟文件,您希望在需要作为测试文件导入的一部分时全局替换这些文件

Jest有一种配置方法。如果浏览Jest配置文档,您会发现一个名为
moduleNameMapper
的属性,它接受一个对象,其中键是正则表达式,值是与正则表达式匹配的相应模块的模拟路径

jest.config.js
中,需要添加一个单独的参数并指定模拟模式和路径

moduleNameMapper: {
    "/^bootstrap/": "<root>/tests/__mocks__/bootstrapMock.js",
    "/^axios/": "<root>/tests/__mocks/axiosMock.js"
}
moduleNameMapper:{
“/^bootstrap/”:“/tests/\uuuu mocks\uuuu/bootstrapMock.js”,
“/^axios/”:“/tests/u mocks/axiosMock.js”
}
您可以在中找到有关用法的更多信息

但是,如果您不想经历所有这些,也可以通过在
节点模块
文件夹旁边放置一个
\uuu mocks\uuuu
文件夹来实现。但是,根据以下文件中的定义:

如果我们想要模拟节点的核心模块(例如:fs或path),则需要显式调用例如jest.mock(“path”),因为默认情况下不会模拟核心节点模块


您想要的是默认的开箱即用,而不改变其行为。至少在create react应用程序中,它的行为是这样的。你的意思是,在CRA中,如果你为给定模块创建一个模拟,并将其放置在
\uuuuuuuuuuuuuu mocks\uuuuuuuuuu
中,它将自动包含而不是原始模块,而无需任何其他配置?@timotgl你在实践中尝试过吗,或者这只是一个假设?你能在上面链接相应的文档吗?”因为这里绝对不是这样。我想你和我一样误解了这一功能-来自
\uu mock\uu
的模块不是自动拾取的,需要显式调用
jest.mock('module\u name')
才能拾取。这里有一个专门的警告:是的,你是对的@jayarijo,我忘了手动的jest.mock调用。我和你一样无知:但是你可以做的是在所有你自己的mock上有一个index.js调用jest.mock,然后在每个测试中只导入这个“mock loader”一次,而不是每次都列出所有模块。