2015-02-07 1 views
4

React/Flux 코드를 작성하고 Jest를 사용하여 테스트 중입니다. 지금까지는 내 테스트가 이미 완료하는 데 오랜 시간이 걸리는 것을 제외하고는 훌륭했습니다.Jest로 테스트 할 때 mock을 재설정하는 더 빠른 방법이 있습니까?

범인은 각 테스트 사이에 mock을 재설정하는 것으로 보입니다. 두 검사 사이에 내가 getDoobles에 대한 호출의 수에 대한 잘못된 결과를 얻을 수에 내가 가게를 다시로드하지 않으면 내 예에서

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

:

내 장군은 다음과 같이 보일 것입니다 설정 이것은 같은 대상이 될 것이므로 의미가 있습니다.

하지만 모의 작업을 다시로드하는 데는 약간의 시간이 걸리며, 많은 테스트를 거치면 속도가 느려집니다.

개체를 복제하거나 재설정 기능을 호출하는 것이 좋습니다. 개별 기능 (mockClear())에 대한 재설정 기능이 있지만 전체 개체에 대해 전역 재설정이없는 것 같습니다. 복제본은 내 React 구성 요소가 액세스하는 객체와 다른 객체가 아니기 때문에 객체를 복제 할 수 없으므로 아무 호출도 등록되지 않습니다.

다른 문제가 나타납니다. 그것은 내가 의존성 체인에있는 모든 것을 다시로드해야 할 것 같습니다. 만약 내가 단지 WidgetStore을 다시 요구한다면, 내가 접근 할 수있는 객체는 Widget에 접근 할 수있는 동일한 객체가 아닌 것처럼 보입니다.

방금 ​​WidgetStoreWidget을 다시로드하면 having two copies of React loaded으로 인한 오류가 자주 발생합니다. 그래서 매번 React를 다시로드해야합니다.

이렇게하는 더 좋은 방법이 있습니까?

답변

5

describe() 전에 React 및 TestUtils 변수를 설정하고 jest.dontMock ('react')을 사용하지 않습니다. 또한 위젯에 필요하며 위젯 스토어가있을 수 있습니다. 귀하의 경우에는 다음과 같습니다 :

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를 조롱하지 말라고 어떻게 스킵 할 수 있는지 이해할 수 없습니다. 모든 React 함수가 모의 객체가되기 때문에 모든 것이 실패 할 것 같은 것처럼 보입니다. 내 예제를 기반으로 이것을 알 수있는 방법은 없습니다.하지만 실제 사용 사례에서 mockClear는 getInitialState 호출로 저장소를 호출하기 때문에 위젯 렌더링보다 위에 있어야합니다. 즉, 렌더링은 매장 조롱 아래 있어야합니다. beforeEach 블록에서 모의 ​​작업을 지우지 만 전체 개체를 다시 설정하는 방법을 찾고있었습니다. 하지만 어쩌면 나는 내 테스트를 재구성하여 좀 더 엄격해질 수 있으므로 몇 가지 기능 만 지울 필요가있을 것입니다. –

+0

아마 @minterior는 package.json에서 React가 ":" "jest": { "scriptPreprocessor": " /preprocessor.js", "unmockedModulePathPatterns": [ "/node_modules/react"]와 같이 조롱되지 않도록 지정했습니다. ,' – pherris