javascript - Jest 手动模拟始终用于 request-promise-native,即使 jest.mock ('request-promise-native' )未在测试中使用

标签 javascript unit-testing jestjs integration-testing

即使 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"); 替换为 jest.unmock("request-promise"); -native"); 或在 mock 中重命名 request-promise-native.js,这样 Jest 就看不到它了。

这是 Jest 的错误还是我的设置的错误? 我还有其他私有(private)模块的手动模拟,它的行为符合预期:当 jest.mock() 存在时使用模拟版本,当 jest.mock 注释掉时使用原始版本。

我发现了类似问题的错误报告 https://github.com/facebook/jest/issues/1552不过好像不久前就已经解决了。

发生这种情况是因为我试图模拟 node_modules 文件夹中的模块吗?

对此的任何帮助都会很棒,因为我希望能够控制使用哪个版本的模块(单元测试的模拟,集成测试的正常),并且还有信心知道仅使用模拟模块当我使用 jest.mock() 时。

最佳答案

Jest 的行为符合预期。

参见Mocking Node modules :

If the module you are mocking is a Node module...the mock should be placed in the __mocks__ directory adjacent to node_modules...and will be automatically mocked. There's no need to explicitly call jest.mock('module_name').

所以是的,你是完全正确的。 Node 模块是自动模拟的,这种行为与用户模块或 Node 核心模块(如 fspath)不同,后者需要调用 jest.mock.

关于javascript - Jest 手动模拟始终用于 request-promise-native,即使 jest.mock ('request-promise-native' )未在测试中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54949797/

相关文章:

javascript - 呈现 Big React Calendar 时出现控制台错误

用于树数据结构的无序集的 Python 单元测试

c - RTOS 中阻止任务间通信

asp.net-mvc - ASP.Net Web API Controller 单元测试 POST

angular - Jest 26 & Angular - 错误地报告了错误行号

javascript - 在 React/Redux 中测试连接的组件

javascript - 无法将对象推送到数组中

javascript - 如何用javascript获取宽度和高度?

javascript - 与多个 if 语句相比,array.includes 对性能有负面影响吗?

javascript - 在 React Native 中运行 mount() 不可能吗?