2015-02-11 75 views
4

我很难测试回流操作在我的应用程序中正确触发,事实上他们似乎根本不用Jest工作。我有这样的例子测试:如何用Jest测试回流行为

jest.autoMockOff(); 

describe('Test', function() { 
    it('Tests actions', function() { 
    var Reflux = require('../node_modules/reflux/index'); 

    var action = Reflux.createAction('action'); 
    var mockFn = jest.genMockFn(); 

    var store = Reflux.createStore({ 
     init: function() { 
     this.listenTo(action, this.onAction); 
     }, 
     onAction: function() { 
     mockFn(); 
     } 
    }); 

    action('Hello World'); 
    expect(mockFn).toBeCalled(); 
    }); 
}); 

,输出:

● Test › it Tests actions 
    - Expected Function to be called. 
    at Spec.<anonymous> (__tests__/Test.js:20:20) 
    at Timer.listOnTimeout [as ontimeout] (timers.js:112:15) 

即使茉莉花异步功能似乎并不奏效

jest.autoMockOff(); 

describe('Test', function() { 
    it('Tests actions', function() { 
    var Reflux = require('../node_modules/reflux/index'); 

    var action = Reflux.createAction('action'); 
    var mockFn = jest.genMockFn(); 

    var flag = false; 

    var store = Reflux.createStore({ 
     init: function() { 
     this.listenTo(action, this.onAction); 
     }, 
     onAction: function() { 
     mockFn(); 
     flag = true; 
     } 
    }); 

    runs(function() { 
     action(); 
    }); 

    waitsFor(function() { 
     return flag; 
    }, 'The action should be triggered.', 5000); 

    runs(function() { 
     expect(mockFn).toBeCalled(); 
    }); 
    }); 
}); 

给我...

FAIL __tests__/Test.js (6.08s) 
● Test › it Tests actions 
    - Throws: [object Object] 

有没有人提出他的工作?

回答

8

我想通了!我只需要使用Jest自己的方法来快速转发任何定时器。即只需添加一行

jest.runAllTimers(); 

所以我的第一个例子中的工作版本将

jest.autoMockOff(); 

describe('Test', function() { 
    it('Tests actions', function() { 
    var Reflux = require('../node_modules/reflux/index'); 

    var action = Reflux.createAction('action'); 
    var mockFn = jest.genMockFn(); 

    var store = Reflux.createStore({ 
     init: function() { 
     this.listenTo(action, this.onAction); 
     }, 
     onAction: function() { 
     mockFn(); 
     } 
    }); 

    action('Hello World'); 

    jest.runAllTimers(); 

    expect(mockFn).toBeCalled(); 
    }); 
});