Jest: 模拟模块优先于 node_modules

创建于 2016-10-13  ·  3评论  ·  资料来源: facebook/jest

你想请求一个_feature_还是报告一个_bug_?
报告一个错误。

当前的行为是什么?
如果一个项目依赖于一个与带有模拟的内部文件同名的模块,则为全局模块而不是全局模块的请求检索模拟实现,需要显式取消模拟(然后打印警告,尽管表现出明显的行为变化)。

如果当前行为是错误,请提供重现的步骤,如果可能的话,请提供 GitHub 上的最小存储库,我们可以npm installnpm test

  1. 克隆https://github.com/ticky/jest-mock-bug , npm install依赖
  2. 运行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
  }
}

最有用的评论

是的,手动模拟优先于节点模块。 手动模拟系统有点粗略。 目前,我们将在下一个版本中删除警告,因此jest.unmock('left-pad')应该是您所需要的。 见#2022

我们的一个想法是为手动节点模块模拟制作一个单独的系统,但这可能应该在单独的提案中讨论,所以我将关闭这个问题。

所有3条评论

我认为这种情况类似于我的项目中发生的情况

就我而言,我有<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

我们的一个想法是为手动节点模块模拟制作一个单独的系统,但这可能应该在单独的提案中讨论,所以我将关闭这个问题。

此页面是否有帮助?
0 / 5 - 0 等级