2015-02-07 4 views
4

Я пишу код 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.

Так есть лучший способ сделать это?

ответ

5

Мы устанавливаем переменные React и TestUtils перед описанием() и не используем jest.dontMock ('response'). Также требуется наличие виджета и WidgetStore. В вашем случае вот так:

jest.dontMock('../Widget.jsx'); 

var React = require('react/addons'); 
var TestUtils = React.addons.TestUtils; 
var WidgetStore = require('../WidgetStore'); 
var Widget = require('../Widget'); 

describe('Widget', function() { 
    var widget; 

    beforeEach(function() { 
    widget = TestUtils.renderIntoDocument(
     <Widget /> 
    ); 
    WidgetStore.getDoobles.mockClear(); 
    }); 

    it('should fetch initial state from the store', function() { 
    WidgetStore.getDoobles.mockReturnValueOnce({}); 

    expect(WidgetStore.getDoobles.mock.calls.length).toBe(1); 
    }); 

    it('should refresh its data when clicked', function() { 
    WidgetStore.getDoobles.mockReturnValueOnce({}); 
    WidgetStore.getDoobles.mockReturnValueOnce({'foo': 'bar'});   

    TestUtils.Simulate.click(widget); 

    expect(WidgetStore.getDoobles.mock.calls.length).toBe(2); 
    }); 
}); 
+0

Я не понимаю, как вы можете пропустить сообщение, чтобы не издеваться над Реатом. Похоже, что все провалится, так как все функции React будут издевательскими. Невозможно узнать об этом на основе моего примера, но в моем реальном случае mockClear должен быть выше визуализации Widget, потому что я вызываю хранилище в вызове getInitialState. Это означает, что рендер также должен быть ниже магазина, насмехающегося. Очистка макета в блоке beforeEach работает, но я действительно искал способ сброса всего объекта. Но, может быть, я должен реорганизовать мои тесты, чтобы быть более прочными, поэтому мне нужно только очистить несколько фанк. –

+0

Возможно, @minterior указала, что React не издевается в package.json так: '' jest ": {" scriptPreprocessor ":" /preprocessor.js "," unmockedModulePathPatterns ": [" /node_modules/react "]} ' – pherris