javascript - 开玩笑:automock 模块,但仅限于 __mocks__ 中定义的模块,而不是全部
问题描述
TL;博士
我想启用某种automock
功能,但仅(并且仅!)针对我在相应__mocks__
文件夹中明确定义的模块。Jest 有办法解决这个问题吗?
也欢迎一般意见和建议。
一点上下文:( 可选)
原来我完全误解了 Jests automock功能。顺便说一句,现在回想起来,我不明白为什么,因为文档非常清楚它的实际作用:
这个选项告诉 Jest 你的测试中所有导入的模块都应该被自动模拟。
好像我刚刚注意到ALL关键字。也许我只是在想 - 但即使对于我实际上要在这里测试的导入函数,拥有一个 automock 也没有意义,不是吗?显然我想从 中自动模拟第三方的东西node_modules
,但不是我自己的代码。事实证明:
注意:当您有一个手动模拟时,节点模块会自动
__mocks__/lodash.js
模拟(例如:) 。注意:核心模块,如 fs,默认情况下不会被模拟。他们可以被明确地嘲笑,比如
jest.mock('fs')
所以这有点与我认为的相反。
解决方案
如果我理解正确,您的__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 模块。
推荐阅读
- appium - 在运行时修改功能名称或在功能文件中使用环境变量/系统属性
- javascript - Array.push 为 array.push 抛出 TypeError 不是函数
- amazon-web-services - 如何为 S3 存储桶中的特定嵌套文件夹创建公共策略?
- c - 节点始终插入 GLib 树的第一个节点
- swift - 快速查找系统字体中的 unicode 字符以在按钮中设置属性标题
- java - 如何将 ItemListener 注册到 CompositeItemProcessor
- javascript - ES6:如何解开内部数组并展平 JSON 数组?
- reactjs - 特定子组件的 PropTypes
- php - wp_mail() 不适用于 WordPress 插件
- serial-port - 通过 bash 脚本发送 AT 命令