即使在所使用的测试中未使用jest.mock('request-promise-native'),Jest手动模拟也始终用于请求承诺本机

时间:2019-03-01 17:45:17

标签: 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的模拟版本(通过在模拟版本中使用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()时。

1 个答案:

答案 0 :(得分:1)

Jest的行为符合预期。

请参见Mocking Node modules

  

如果您要模拟的模块是Node模块...该模拟应放置在__mocks__旁边的node_modules目录中...并将自动 嘲笑。无需显式调用jest.mock('module_name')

是的,你是完全正确的。 自动模拟了节点模块,这种行为不同于需要调用fs的用户模块或节点核心模块(例如pathjest.mock)。< / p>