Есть ли какой-либо способ в 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
является фантастическим для проверки удаленного сетевого ресурса.