首页 > 解决方案 > 开玩笑:automock 模块,但仅限于 __mocks__ 中定义的模块,而不是全部

问题描述

TL;博士

我想启用某种automock功能,但仅(并且仅!)针对我在相应__mocks__文件夹中明确定义的模块。Jest 有办法解决这个问题吗?

也欢迎一般意见和建议。

一点上下文:( 可选)

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

这个选项告诉 Jest 你的测试中所有导入的模块都应该被自动模拟。

好像我刚刚注意到ALL关键字。也许我只是在想 - 但即使对于我实际上要在这里测试的导入函数,拥有一个 automock 也没有意义,不是吗?显然我想从 中自动模拟第三方的东西node_modules,但不是我自己的代码。事实证明:

注意:当您有一个手动模拟时,节点模块会自动__mocks__/lodash.js模拟(例如:) 。

注意:核心模块,如 fs,默认情况下不会被模拟。他们可以被明确地嘲笑,比如jest.mock('fs')

所以这有点与我认为的相反。

标签: javascripttypescriptunit-testingjestjsautomocking

解决方案


如果我理解正确,您的__mocks__文件夹中有某些模拟文件,您希望在需要它们作为测试文件导入的一部分时进行全局替换。

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

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

moduleNameMapper: {
    "/^bootstrap/": "<root>/tests/__mocks__/bootstrapMock.js",
    "/^axios/": "<root>/tests/__mocks/axiosMock.js"
}

您可以在Jest 文档中找到有关使用的更多信息。

但是,如果您不想经历所有这些,也可以通过在__mocks__文件夹旁边放置一个文件夹来实现node_modules但是,如Manual Mocks的文档中所定义:

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


推荐阅读