Ich muss eine Funktion testen, die einen neuen Tab im Browser öffnet
openStatementsReport(contactIds) {
window.open(`a_url_${contactIds}`);
}
Ich möchte die Öffnungsfunktion des Fensters verspotten, damit ich überprüfen kann, ob die richtige URL an die Öffnungsfunktion übergeben wird.
Mit Jest weiß ich nicht, wie ich das Fenster verspotten soll. Ich habe versucht, window.open mit einer Mock-Funktion einzustellen, aber dieser Weg funktioniert nicht. Unten ist der Testfall
it('correct url is called', () => {
window.open = jest.fn();
statementService.openStatementsReport(111);
expect(window.open).toBeCalled();
});
aber es gibt mir den Fehler
expect(jest.fn())[.not].toBeCalled()
jest.fn() value must be a mock function or spy.
Received:
function: [Function anonymous]
Was soll ich mit dem Testfall machen? Anregungen oder Hinweise sind willkommen
javascript
mocking
jestjs
danny
quelle
quelle
window
fürglobal
Eine Methode, die für mich funktioniert hat, war die folgende. Dieser Ansatz erlaubt mir einige Code zu testen , die sowohl im Browser und in Knoten funktionieren sollte, da es mir erlaubt, eingestellt
window
zuundefined
.Dies war mit Jest 24.8 (glaube ich):
quelle
Object.defineProperty
da dies erlaubt, andere Tests beim Verspotten nicht zu beeinflussen.Wir können es auch mit
global
in definierensetupTests
Und nennen Sie es
global
im eigentlichen Test:quelle
Sie können dies versuchen:
quelle
Es gibt verschiedene Möglichkeiten, sich in Jest über Globals lustig zu machen:
mockImplementation
Ansatz (meistens scherzhaft), aber er funktioniert nur für die Variablen, für die eine Standardimplementierung bereitgestellt wird.jsdom
Dieswindow.open
ist eine davon:window
Variablen, zwindow.href
.Anstatt den globalen Wert direkt zu verwenden, ist es möglicherweise sauberer, ihn aus einer anderen Datei zu importieren, sodass das Verspotten mit Jest trivial wird.
./test.js
./fileWithGlobalValueExported.js
./testedFile.js
quelle
Wenn es dem Problem mit der Fensterposition unter https://github.com/facebook/jest/issues/890 ähnelt , können Sie versuchen, [angepasst]
quelle
Ich habe einen einfachen Weg gefunden: Löschen und Ersetzen
quelle
Fügen Sie in Ihrer Scherzkonfiguration setupFilesAfterEnv: ["./setupTests.js"] hinzu, erstellen Sie diese Datei und fügen Sie den Code hinzu, den Sie vor den Tests ausführen möchten
Ref: https://jestjs.io/docs/en/configuration#setupfilesafterenv-array
quelle
In meiner Komponente, auf die ich Zugriff habe
window.location.search
, habe ich Folgendes im Scherztest getan:Falls die Fenstereigenschaften in verschiedenen Tests unterschiedlich sein müssen, können wir eine Verspottung in eine Funktion einfügen und diese beschreibbar machen, um sie für verschiedene Tests zu überschreiben:
Und nach jedem Test zurücksetzen
quelle