2

我正在阅读此处的 Redux 教程。

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

异步功能完成后会触发副作用。在我自己的应用程序中执行此异步测试时。我收到如下回复:

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 教程中的代码完全相同,除了我的 action creator 有这个副作用。

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

4

3 回答 3

0

依赖于获取当前时间的测试代码不是一个好主意。您需要重写一些东西,以便您可以模拟或注入日期。在(单元测试、如何编写可测试的代码及其重要性)中有一些很好的例子。那篇文章是基于 C# 的,但同样的概念也适用于此处。

于 2016-01-28T18:31:43.460 回答
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 ...', () => { ... });
});
于 2019-01-28T07:31:29.813 回答
-1

我认为您需要在测试中建立一些容忍度,因为在调度操作和接收响应之间不可避免地会经过一些时间。即使你伪造它,执行时间仍然会有差异。您实际如何执行此操作取决于您的断言库。

于 2016-01-28T17:17:19.337 回答