Подтвердить что ты не робот

Как обмануть окно/документ с моккой/чаем

Когда я пытаюсь выполнить unit test функцию getElement

class BarFoo {
    getElement() {
        return document.querySelector('#barfoo');
    }
}

mocha ничего не знает о document, поэтому я решил, что вы можете сделать что-то вроде этого:

beforeEach(() => {
    global.document = {
        querySelector: () => { ... }
    }
}

Хотя это работает, мне интересно, правильно ли это подход, и, возможно, есть пакет для решения этой проблемы, потому что мой подход может стать трудоемким, если используется больше API браузера?

4b9b3361

Ответ 1

Я писал тесты, похожие на те, что вы предлагали, когда мне просто нужно было смоделировать определенную функцию в окне:

it('html test', function () {
    const windowRef = global.window;
    global.window = {document: {querySelector: () => null}};
    const lib = require('lib-that-uses-queryselector');
    assert(true);
    global.window = windowRef;
});

Я использовал mock-browser в других тестах, когда хотел более полный оконный объект:

it('html test', function () {
     const windowRef = global.window;
     const MockBrowser = require('mock-browser').mocks.MockBrowser;
     global.window = new MockBrowser().getWindow();
     const lib = require('lib-that-uses-window');
     assert(true);
     global.window = windowRef;
});

Обратите внимание, что вы, вероятно, захотите восстановить объект окна (global.window = windowRef; выше) после работы с глобальными переменными.

Ответ 2

Доступно несколько вариантов:

Вариант 1: используйте JSDOM

Добавив DOM к вашему коду, вы можете unit test большую часть вашего клиентского кода в node.js

Вариант 2. Использование MOCHA на клиенте

Mocha запускается внутри клиента, и вы можете использовать отдельные тестовые тесты на стороне клиента. Это, как правило, мой предпочтительный подход, поскольку я могу протестировать против конкретных браузеров, а не для конкретной имплантации JS.

Вариант 3: используйте PhantomJS

PhantomJS позволяет вам управлять безгласным браузером в тестовой среде.

Вариант 4: Безголовый Chrome

Теперь, когда Headless Chrome отключен, сторонник PhantomJS вышел на пенсию.