你想请求一个_feature_还是报告一个_bug_?
报告一个错误。
当前的行为是什么?
如果一个项目依赖于一个与带有模拟的内部文件同名的模块,则为全局模块而不是全局模块的请求检索模拟实现,需要显式取消模拟(然后打印警告,尽管表现出明显的行为变化)。
如果当前行为是错误,请提供重现的步骤,如果可能的话,请提供 GitHub 上的最小存储库,我们可以npm install
和npm test
。
npm install
依赖npm test
期望能够导入全局模块( with no explicit opt-out › globalPad should not be a mock function
)的测试失败,因为返回的模块实际上是手动模拟。
(注意这里使用了left-pad
,因为它是一个没有编译要求的小模块。)
预期的行为是什么?
import 语句应该返回全局模块,就像它在explicit-opt-out.js
所做的那样
使用--debug
再次运行 Jest 并提供它打印的完整配置。
jest version = 16.0.1
test framework = jasmine2
config = {
"rootDir": "/Users/jessica/Repositories/jest-mock-bug",
"name": "-Users-jessica-Repositories-jest-mock-bug",
"setupFiles": [],
"testRunner": "/Users/jessica/Repositories/jest-mock-bug/node_modules/jest-jasmine2/build/index.js",
"scriptPreprocessor": "/Users/jessica/Repositories/jest-mock-bug/node_modules/babel-jest/build/index.js",
"usesBabelJest": true,
"automock": false,
"bail": false,
"browser": false,
"cacheDirectory": "/var/folders/rl/98bml8qx57n3b6xgsgyvbxtr0000gn/T/jest",
"clearMocks": false,
"coveragePathIgnorePatterns": [
"/node_modules/"
],
"coverageReporters": [
"json",
"text",
"lcov",
"clover"
],
"globals": {},
"haste": {
"providesModuleNodeModules": []
},
"mocksPattern": "__mocks__",
"moduleDirectories": [
"node_modules"
],
"moduleFileExtensions": [
"js",
"json",
"jsx",
"node"
],
"moduleNameMapper": {},
"modulePathIgnorePatterns": [],
"noStackTrace": false,
"notify": false,
"preset": null,
"preprocessorIgnorePatterns": [
"/node_modules/"
],
"resetModules": false,
"testEnvironment": "jest-environment-jsdom",
"testPathDirs": [
"/Users/jessica/Repositories/jest-mock-bug"
],
"testPathIgnorePatterns": [
"/node_modules/"
],
"testRegex": "(/__tests__/.*|\\.(test|spec))\\.jsx?$",
"testURL": "about:blank",
"timers": "real",
"useStderr": false,
"verbose": null,
"watch": false,
"cache": true,
"watchman": true,
"testcheckOptions": {
"times": 100,
"maxSize": 200
}
}
我认为这种情况类似于我的项目中发生的情况
就我而言,我有<rootDir>/__mocks__/left-pad.js
。 所有导入left-pad
都会自动导入模拟的left-pad
即使我没有明确调用jest.mock('left-pad')
我当前的解决方法是显式模拟,然后显式取消模拟它们。 这很丑陋,但它有效
jest.mock('left-pad');
jest.unmock('left-pad');
啊哈,谢谢! 这是一个比我更干净的解决方法,尽管仍然绝对不理想!
是的,手动模拟优先于节点模块。 手动模拟系统有点粗略。 目前,我们将在下一个版本中删除警告,因此jest.unmock('left-pad')
应该是您所需要的。 见#2022
我们的一个想法是为手动节点模块模拟制作一个单独的系统,但这可能应该在单独的提案中讨论,所以我将关闭这个问题。
最有用的评论
是的,手动模拟优先于节点模块。 手动模拟系统有点粗略。 目前,我们将在下一个版本中删除警告,因此
jest.unmock('left-pad')
应该是您所需要的。 见#2022我们的一个想法是为手动节点模块模拟制作一个单独的系统,但这可能应该在单独的提案中讨论,所以我将关闭这个问题。