Ich fange an zu denken, dass dies nicht möglich ist, aber ich möchte trotzdem fragen.
Ich möchte testen, ob eines meiner ES6-Module ein anderes ES6-Modul auf eine bestimmte Weise aufruft. Mit Jasmine ist das super einfach -
Der App-Code:
// myModule.js
import dependency from './dependency';
export default (x) => {
dependency.doSomething(x * 2);
}
Und der Testcode:
//myModule-test.js
import myModule from '../myModule';
import dependency from '../dependency';
describe('myModule', () => {
it('calls the dependency with double the input', () => {
spyOn(dependency, 'doSomething');
myModule(2);
expect(dependency.doSomething).toHaveBeenCalledWith(4);
});
});
Was ist das Äquivalent zu Jest? Ich denke, das ist so einfach zu tun, aber ich habe mir die Haare ausgerissen, um es herauszufinden.
Am nächsten komme ich, indem ich das import
s durch require
s ersetze und es in die Tests / Funktionen verschiebe. Beides möchte ich nicht tun.
// myModule.js
export default (x) => {
const dependency = require('./dependency'); // yuck
dependency.doSomething(x * 2);
}
//myModule-test.js
describe('myModule', () => {
it('calls the dependency with double the input', () => {
jest.mock('../dependency');
myModule(2);
const dependency = require('../dependency'); // also yuck
expect(dependency.doSomething).toBeCalledWith(4);
});
});
Für Bonuspunkte würde ich gerne dafür sorgen, dass das Ganze funktioniert, wenn die darin enthaltene Funktion dependency.js
ein Standardexport ist. Ich weiß jedoch, dass das Ausspionieren von Standardexporten in Jasmine nicht funktioniert (oder zumindest könnte ich es nie zum Laufen bringen), also hoffe ich nicht, dass es auch in Jest möglich ist.
quelle
import
s zurequire
s weiter zu transpilieren . Vielen Dank für die Hinweise.Antworten:
Ich konnte dies mit einem Hack lösen
import *
. Es funktioniert sogar sowohl für benannte als auch für Standardexporte!Für einen benannten Export:
Oder für einen Standardexport:
Wie Mihai Damian unten zu Recht hervorhob, mutiert dies das Modulobjekt von
dependency
und wird daher auf andere Tests übertragen. Wenn Sie diesen Ansatz verwenden, sollten Sie den ursprünglichen Wert speichern und ihn nach jedem Test erneut zurücksetzen. Um dies mit Jest einfach zu machen, verwenden Sie die spyOn () -Methode anstelle der Methodejest.fn()
, die die einfache Wiederherstellung des ursprünglichen Werts unterstützt, und vermeiden Sie daher das zuvor erwähnte "Lecken".quelle
dependency
sich die Datei in derselben Datei befindet wiemyModule
, funktioniert sie nicht.Sie müssen das Modul verspotten und den Spion selbst einstellen:
quelle
babel-plugin-jest-hoist: The second argument of jest.mock must be a function.
Der Code wird also nicht einmal kompiliert.jest.mock
relativ zur Testdatei ist.__esModule: true
. Dies ist das interne Flag, das vom transpilierten Code verwendet wird, um zu bestimmen, ob es sich um ein transpiliertes es6-Modul oder ein commonjs-Modul handelt.jest.mock('../dependency', () => ({ default: jest.fn() }))
So verspotten Sie den Standardexport eines ES6-Abhängigkeitsmoduls mithilfe von Scherz:
Die anderen Optionen haben in meinem Fall nicht funktioniert.
quelle
Hinzufügen zu mehr Antwort von Andreas. Ich hatte das gleiche Problem mit ES6-Code, wollte aber die Importe nicht mutieren. Das sah hackig aus. Also habe ich das gemacht
Und dependency.js im Ordner "__ mocks __" parallel zu dependency.js hinzugefügt . Das hat bei mir funktioniert. Dies gab mir auch die Möglichkeit, geeignete Daten aus der Scheinimplementierung zurückzugeben. Stellen Sie sicher, dass Sie den richtigen Pfad zu dem Modul angeben, das Sie verspotten möchten.
quelle
__mocks__/translations.js
Datei exportiert einfach standardmäßigjest.fn()
in etwa:export default jest.fn((id) => id)
jest.genMockFromModule
Mocks aus Modulen generieren. facebook.github.io/jest/docs/…export default jest.genMockFromModule('../dependency')
die verspottet wird, alle Funktionendependency.default
nach dem Aufruf von `jest.mock ('.. dependency') zugewiesen werden , sich aber ansonsten wie erwartet verhalten.expect(???)
Beim schnellen Vorlauf bis 2020 fand ich diesen Link als Lösung. Verwenden nur der ES6-Modulsyntax https://remarkablemark.org/blog/2018/06/28/jest-mock-default-named-export/
Außerdem müssen Sie wissen (was ich eine Weile gebraucht habe, um herauszufinden), dass Sie im Test nicht jest.mock () aufrufen können. Sie müssen es auf der obersten Ebene des Moduls aufrufen. Sie können jedoch mockImplementation () in einzelnen Tests aufrufen, wenn Sie verschiedene Mocks für verschiedene Tests einrichten möchten.
quelle
Die Frage ist bereits beantwortet, aber Sie können sie folgendermaßen lösen:
dependency.js
myModule.js:
myModule.spec.js:
quelle
Ich habe das anders gelöst. Angenommen, Sie haben Ihre dependency.js
Ich erstelle außerdem eine depdency.mock.js-Datei mit folgendem Inhalt:
und im Test, bevor ich die Datei importiere, die die von mir verwendete Abhängigkeit hat:
quelle