【问题标题】:Jest manual mock always used for request-promise-native even when jest.mock('request-promise-native') is not used in test used即使在使用的测试中未使用 jest.mock('request-promise-native') 时,Jest 手动模拟也始终用于 request-promise-native
【发布时间】: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


    【解决方案1】:

    Jest 的行为符合预期。

    Mocking Node modules:

    如果您要模拟的模块是 Node 模块...模拟应放置在与 node_modules 相邻的 __mocks__ 目录中...并且将被自动模拟。无需显式调用jest.mock('module_name')

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

    【讨论】:

    • 谢谢你的回答,我错过了那一点信息!我想我必须设置测试环境并根据需要模拟/取消模拟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多