Jest: Scheinmodule haben Vorrang vor node_modules

Erstellt am 13. Okt. 2016  ·  3Kommentare  ·  Quelle: facebook/jest

Möchten Sie ein _Feature_ anfordern oder einen _Bug_ melden?
Melde einen technischen Fehler.

Wie ist das aktuelle Verhalten?
Wenn ein Projekt eine Abhängigkeit von einem Modul mit dem gleichen Namen wie eine interne Datei mit einem Mock hat, wird diese Mock-Implementierung für Anforderungen des globalen Moduls anstelle des globalen Moduls abgerufen, was eine explizite Entmockung erfordert (die dann eine Warnung ausgibt, trotz eine spürbare Verhaltensänderung zeigen).

Wenn das aktuelle Verhalten ein Fehler ist, geben Sie bitte die Schritte zum Reproduzieren und wenn möglich ein minimales Repository auf GitHub an, das wir npm install und npm test .

  1. Klonen Sie https://github.com/ticky/jest-mock-bug , npm install Abhängigkeiten
  2. npm test

Der Test, der erwartet, das globale Modul ( with no explicit opt-out › globalPad should not be a mock function ) importieren zu können, schlägt fehl, da das zurückgegebene Modul tatsächlich der manuelle Mock ist.

(Beachten Sie, dass hier left-pad verwendet wird, da es sich um ein kleines Modul ohne Kompilierungsanforderungen handelt.)

Was ist das erwartete Verhalten?

Die Importanweisung sollte das globale Modul zurückgeben, wie es in explicit-opt-out.js Fall ist

Führen Sie Jest erneut mit --debug und geben Sie die vollständige Konfiguration an, die es ausdruckt.

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
  }
}

Hilfreichster Kommentar

Ja, manuelle Mocks haben Vorrang vor Knotenmodulen. Das manuelle Mocks-System ist ein bisschen skizzenhaft. Im Moment entfernen wir die Warnung in der nächsten Version, daher sollten jest.unmock('left-pad') alles sein, was Sie brauchen. Siehe #2022

Eine Idee, die wir hatten, war, ein separates System für manuelle Node-Modul-Mocks zu entwickeln, aber das sollte wahrscheinlich in einem separaten Vorschlag diskutiert werden, also werde ich dieses Thema schließen.

Alle 3 Kommentare

Ich denke, dieser Fall ähnelt dem, was in meinem Projekt passiert ist

In meinem Fall habe ich <rootDir>/__mocks__/left-pad.js . Alle Tests, die left-pad importieren, importieren automatisch die verspotteten left-pad , obwohl ich jest.mock('left-pad') nicht explizit aufgerufen habe

Meine aktuelle Problemumgehung besteht darin, sie explizit zu verspotten und dann explizit aufzuheben. Es ist hässlich, aber es funktioniert

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

Aha, danke! Das ist eine sauberere Problemumgehung als meine, aber immer noch nicht ideal!

Ja, manuelle Mocks haben Vorrang vor Knotenmodulen. Das manuelle Mocks-System ist ein bisschen skizzenhaft. Im Moment entfernen wir die Warnung in der nächsten Version, daher sollten jest.unmock('left-pad') alles sein, was Sie brauchen. Siehe #2022

Eine Idee, die wir hatten, war, ein separates System für manuelle Node-Modul-Mocks zu entwickeln, aber das sollte wahrscheinlich in einem separaten Vorschlag diskutiert werden, also werde ich dieses Thema schließen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

withinboredom picture withinboredom  ·  3Kommentare

stephenlautier picture stephenlautier  ·  3Kommentare

StephanBijzitter picture StephanBijzitter  ·  3Kommentare

hramos picture hramos  ·  3Kommentare

ianp picture ianp  ·  3Kommentare