【发布时间】:2019-07-23 18:59:33
【问题描述】:
即使 jest.mock("request-promise-native") 被注释掉,我的测试中也总是使用模拟的 'request-promise-native' 模块。
项目结构如下:
project
└───__mocks__
│ └───request-promise-native.js
└───node_modules
│ │ folder1
│ │ ...
│ └───request-promise-native
│ │ │ lib
│ │ │ ...
└───src
│ │ file1
│ │ ...
└───test
└───sometest.test.js
在 sometest.test.js 中,我使用了jest.mock("request-promise-native");,这成功地使用了 request-promise-native 的模拟版本(通过在模拟版本中使用 console.log 来证明)。
当我在 sometest.test.js 中注释掉jest.mock("request-promise-native"); 时,仍然使用模拟版本?!
我的印象是 jest automock 选项默认设置为 false 所以它应该使用模块的实际版本?
为了弄明白这一切,我在配置文件中将 automock 选项设置为 false,它仍然是一样的。
我可以获得要使用的实际版本的唯一方法是将 jest.mock("request-promise-native"); 替换为 jest.unmock("request-promise-native"); 或在 mock 中重命名 request-promise-native.js,这样它就不会被开玩笑。
这是开玩笑还是我的设置的错误? 我有其他私有模块的手动模拟,它的行为符合预期:当 jest.mock() 存在时使用的模拟版本和 jest.mock 注释掉时使用的原始版本。
我发现了一个类似问题的错误报告https://github.com/facebook/jest/issues/1552,但它似乎已经在不久前解决了。
这是因为我试图模拟 node_modules 文件夹中的模块吗?
对此的任何帮助都会很棒,因为我希望能够控制使用哪个版本的模块(模拟用于单元测试,正常用于集成测试)并且有信心知道仅使用模拟模块当我使用 jest.mock() 时。
【问题讨论】:
标签: javascript unit-testing jestjs integration-testing