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を参照

私たちが持っていたアイデアの1つは、手動ノードモジュールモック用に別のシステムを作成することでしたが、それは別の提案で議論される可能性が高いので、この問題を締めくくります。

全てのコメント3件

このケースは私のプロジェクトで起こっていることと似ていると思います

私の場合、 <rootDir>/__mocks__/left-pad.jsます。 jest.mock('left-pad')明示的に呼び出さなかった場合でも、 left-padをインポートするすべてのテストは、モックされたleft-padを自動的にインポートします。

私の現在の回避策は、明示的にモックを作成してから、明示的にモックを解除することです。 醜いですが、うまくいきます

jest.mock('left-pad');
jest.unmock('left-pad');

ああ、ありがとう! それはまだ絶対に理想的ではありませんが、それは私のものよりもクリーンな回避策です!

はい、手動モックはノードモジュールよりも優先されます。 手動モックシステムは少し大ざっぱです。 今のところ、次のリリースで警告を削除するので、必要なのはjest.unmock('left-pad')だけです。 #2022を参照

私たちが持っていたアイデアの1つは、手動ノードモジュールモック用に別のシステムを作成することでしたが、それは別の提案で議論される可能性が高いので、この問題を締めくくります。

このページは役に立ちましたか?
0 / 5 - 0 評価