Я пишу код React/Flux и используя Jest для его проверки. Пока это было здорово, за исключением того, что мой тест уже занимает много времени.Есть ли более быстрый способ сбросить макет при тестировании с помощью Jest?
Преступник, похоже, перезагружает насмешки между каждым тестом.
Мой общий настроить будет выглядеть примерно так:
jest.dontMock('react');
jest.dontMock('../Widget.jsx');
describe('Widget', function() {
var React, TestUtils, Widget, WidgetStore;
beforeEach(function() {
React = require('react/addons');
TestUtils = React.addons.TestUtils;
WidgetStore = require('../WidgetStore');
Widget = require('../Widget');
});
it('should fetch initial state from the store', function() {
WidgetStore.getDoobles.mockReturnValueOnce({});
var widget = TestUtils.renderIntoDocutment(
<Widget />
);
expect(WidgetStore.getDoobles.mock.calls.length).toBe(1);
});
it('should refresh its data when clicked', function() {
WidgetStore.getDoobles.mockReturnValueOnce({});
var widget = TestUtils.renderIntoDocutment(
<Widget />
);
WidgetStore.getDoobles.mockReturnValueOnce({'foo': 'bar'});
TestUtils.Simulate.click(widget);
expect(WidgetStore.getDoobles.mock.calls.length).toBe(2);
});
});
В моем примере, если я не перезарядить магазин в период между двумя тестами я получаю неправильный результат для числа звонков в getDoobles
, что имеет смысл, поскольку это будет один и тот же объект.
Но перезагрузка макета занимает немного времени, и если я делаю много тестов, тогда они оказываются медленными.
Я хотел бы просто клонировать объект или вызвать функцию сброса. Существует функция сброса для отдельной функции (mockClear()
), но, похоже, не существует глобального сброса для всего объекта. И я не могу клонировать объект, потому что клон - это не тот объект, к которому обращается компонент React, поэтому ни один из вызовов не будет зарегистрирован.
Что вызывает другую проблему. Кажется, мне нужно перезагрузить все в цепочке зависимостей. Если бы мне нужно было просто повторно потребовать WidgetStore
, то объект, к которому у меня есть доступ, похоже, не тот же объект, к которому имеет доступ Widget
.
Если я просто перезаряжаю WidgetStore
и Widget
, то я часто получаю ошибки, которые, по-видимому, вызваны having two copies of React loaded. Поэтому мне приходится снова и снова перезаписывать React.
Так есть лучший способ сделать это?
Я не понимаю, как вы можете пропустить сообщение, чтобы не издеваться над Реатом. Похоже, что все провалится, так как все функции React будут издевательскими. Невозможно узнать об этом на основе моего примера, но в моем реальном случае mockClear должен быть выше визуализации Widget, потому что я вызываю хранилище в вызове getInitialState. Это означает, что рендер также должен быть ниже магазина, насмехающегося. Очистка макета в блоке beforeEach работает, но я действительно искал способ сброса всего объекта. Но, может быть, я должен реорганизовать мои тесты, чтобы быть более прочными, поэтому мне нужно только очистить несколько фанк. –
Возможно, @minterior указала, что React не издевается в package.json так: '' jest ": {" scriptPreprocessor ":" /preprocessor.js "," unmockedModulePathPatterns ": [" /node_modules/react "]} ' –
pherris