Дразнящие глобалы в Jest

Есть ли способ в Jest издеваться над глобальными объектами, такими какnavigator, или жеImage*? Я в значительной степени разочаровался в этом и оставил это на усмотрение серии вспомогательных методов. Например:

// Utils.js
export isOnline() {
    return navigator.onLine;
}

Тестирование этой крошечной функции простое, но грубое и совсем не детерминированное. Я могу пройти 75% пути, но это все, что я могу сделать:

// Utils.test.js
it('knows if it is online', () => {
    const { isOnline } = require('path/to/Utils');

    expect(() => isOnline()).not.toThrow();
    expect(typeof isOnline()).toBe('boolean');
});

С другой стороны, если я в порядке с этим косвенным указанием, я могу теперь получить доступnavigator с помощью этих утилит:

// Foo.js
import { isOnline } from './Utils';

export default class Foo {
    doSomethingOnline() {
        if (!isOnline()) throw new Error('Not online');

        /* More implementation */            
    }
}

... и детерминистически проверить, как это ...

// 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();
});

Из всех каркасов тестирования, которые я использовал, Jest кажется наиболее полным решением, но всякий раз, когда я пишу неуклюжий код, чтобы сделать его тестируемым, я чувствую, что мои инструменты тестирования подводят меня.

Это единственное решение или мне нужно добавить Rewire?

* Не ухмыляйся.Image отлично подходит для проверки связи с удаленным сетевым ресурсом.

Ответы на вопрос(3)

Ваш ответ на вопрос