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
.
npm install
Abhängigkeitennpm 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
}
}
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.
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 #2022Eine 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.