Verspottung Globals in Jest
Gibt es eine Möglichkeit, im Scherz zu verspotten, Globale Objekte, wie navigator
oder Image
*? Ich habe ziemlich viel aufgegeben auf dieser, und ließ Sie bis zu einer Reihe von mockable utility-Methoden. Zum Beispiel:
//Utils.js
export isOnline() {
return navigator.onLine;
}
Testen diese kleine Funktion ist einfach, aber crufty und nicht deterministisch überhaupt. Ich kann 75% der Weg dorthin, aber das ist ungefähr so weit wie ich gehen kann:
//Utils.test.js
it('knows if it is online', () => {
const { isOnline } = require('path/to/Utils');
expect(() => isOnline()).not.toThrow();
expect(typeof isOnline()).toBe('boolean');
});
Auf der anderen Seite, wenn ich bin okay mit dieser Dereferenzierung kann ich jetzt auf navigator
über diese Dienstprogramme:
//Foo.js
import { isOnline } from './Utils';
export default class Foo {
doSomethingOnline() {
if (!isOnline()) throw new Error('Not online');
/* More implementation */
}
}
...und deterministisch zu testen, wie dies...
//Foo.test.js
it('throws when offline', () => {
const Utils = require('../services/Utils');
Utils.isOnline = jest.fn(() => isOnline);
const Foo = require('../path/to/Foo').default;
let foo = new Foo();
//User is offline -- should fail
let isOnline = false;
expect(() => foo.doSomethingOnline()).toThrow();
//User is online -- should be okay
isOnline = true;
expect(() => foo.doSomethingOnline()).not.toThrow();
});
Alle testing-frameworks die ich benutzt habe, der Spaß fühlt sich an wie die umfassendste Lösung, aber jedes mal, wenn ich Schreibe umständlich code nur getestet werden, ich fühle mich wie meine Test-tools lassen mich im Stich.
Ist dies die einzige Lösung oder muss ich hinzufügen Rewire?
*Nicht grinsen. Image
ist fantastisch für Ping einem remote-Netzwerk-Ressource.
InformationsquelleAutor der Frage Andrew | 2016-11-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als jedem test-Lauf die eigene Umgebung können Sie mock-globals, indem Sie Sie einfach überschreiben. Alle globalen vars können aufgerufen werden, indem die
global
- name-space.Dem überschreiben hat nur Auswirkungen in Ihrem aktuellen test und hat keinen Einfluss auf andere. Dies ist auch ein guter Weg, um zu behandeln
Math.random
oderDate.now
Beachten Sie, dass durch einige änderungen in jsdom kann es sein, dass Sie zu verspotten globals wie diese:
InformationsquelleAutor der Antwort Andreas Köberle
Scherz kann sich geändert haben, seit die akzeptierte Antwort geschrieben wurde, aber der Spaß scheint nicht zu reset your global nach der Prüfung. Finden Sie die testcases befestigt.
https://repl.it/repls/DecentPlushDeals
Soweit ich weiß, ist der einzige Weg, um dieses ist mit einem
afterEach()
oderafterAll()
zu bereinigen, Ihre Aufgaben zuglobal
.InformationsquelleAutor der Antwort smeltedcode