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

Schreibe einen Kommentar