即使 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 的模拟版本(通过使用控制台进行了证明) .登录模拟版本)。
当我在 sometest.test.js 中注释掉 jest.mock("request-promise-native");
时,仍然使用模拟版本?!
我的印象是开 Jest ,automock 选项默认设置为 false,所以它应该使用模块的实际版本?
为了尝试理解这一切,我在配置文件中将 automock 选项设置为 false,结果仍然相同。
我可以获得实际使用版本的唯一方法是将 jest.mock("request-promise-native"); 替换为
或在 mock 中重命名 request-promise-native.js,这样 Jest 就看不到它了。jest.unmock("request-promise");
-native");
这是 Jest 的错误还是我的设置的错误? 我还有其他私有(private)模块的手动模拟,它的行为符合预期:当 jest.mock() 存在时使用模拟版本,当 jest.mock 注释掉时使用原始版本。
我发现了类似问题的错误报告 https://github.com/facebook/jest/issues/1552不过好像不久前就已经解决了。
发生这种情况是因为我试图模拟 node_modules 文件夹中的模块吗?
对此的任何帮助都会很棒,因为我希望能够控制使用哪个版本的模块(单元测试的模拟,集成测试的正常),并且还有信心知道仅使用模拟模块当我使用 jest.mock() 时。
最佳答案
Jest
的行为符合预期。
If the module you are mocking is a Node module...the mock should be placed in the
__mocks__
directory adjacent tonode_modules
...and will be automatically mocked. There's no need to explicitly calljest.mock('module_name')
.
所以是的,你是完全正确的。 Node 模块是自动模拟的,这种行为与用户模块或 Node 核心模块(如 fs
或 path
)不同,后者需要调用 jest.mock
.
关于javascript - Jest 手动模拟始终用于 request-promise-native,即使 jest.mock ('request-promise-native' )未在测试中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54949797/