在Redux操作中测试副作用

时间:2016-01-28 14:45:08

标签: javascript redux redux-thunk nock

我正在通过Redux教程找到here

在我创建的应用中,我有一个带副作用的动作,就像在调用Date.now()的receivePosts函数中显示here一样。

异步功能完成后会触发副作用。在我自己的应用中关注this async test时我得到的反应如下:

actual: 
{ 
  type: 'REQUEST_LEAGUE_SUCCESS',
  receivedAt: 1453991947254,
  league: 'Div 3',
  resultsTable: [ [Object], [Object] ] 
},

expected: 
{ 
  type: 'REQUEST_LEAGUE_SUCCESS',
  league: 'Div 3',
  receivedAt: 1453991947235,
  resultsTable: [ [Object], [Object] ]
}

其中我的预期行动的日期不等于实际行动的日期。在我预期的行动中,我有以下内容:

receivedAt: Date.now()

我的代码结构与Redux教程中的代码完全相同,除了我的动作创建者有这种副作用。

我的问题归结为:我如何处理这些副作用以使我的测试通过?

3 个答案:

答案 0 :(得分:0)

依赖于抓住当前时间的测试代码不是一个好主意。您需要重写一些内容,以便模拟或注入日期。在http://www.toptal.com/qa/how-to-write-testable-code-and-why-it-matters处执行此操作的一些很好的示例。那篇文章是基于C#的,但同样的概念适用于此。

答案 1 :(得分:0)

您可以像这样模拟Date.now()函数:

describe('>>> Test Name', () => {
    const literallyJustNow = Date.now();
    const realDateNow = Date.now.bind(global.Date);
    const dateNowStub = jest.fn(() => literallyJustNow);

    beforeEach(() => {
        global.Date.now = dateNowStub;
    });

    afterEach(() => {
        global.Date.now = realDateNow;
    });

    it('... your tests ...', () => { ... });
});

答案 2 :(得分:-1)

我认为您需要在测试中建立一些容忍度,因为在调度操作和接收响应之间不可避免地会花费一些时间。即使你假装它,执行时间仍然会有所不同。你实际上如何做这取决于你的断言库。