即使在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()时。
答案 0 :(得分:1)
Jest
的行为符合预期。
如果您要模拟的模块是Node模块...该模拟应放置在
__mocks__
旁边的node_modules
目录中...并将自动 嘲笑。无需显式调用jest.mock('module_name')
。
是的,你是完全正确的。 自动模拟了节点模块,这种行为不同于需要调用fs
的用户模块或节点核心模块(例如path
或jest.mock
)。< / p>