Javascript 测试Redux操作中的副作用

Javascript 测试Redux操作中的副作用,javascript,redux,redux-thunk,nock,Javascript,Redux,Redux Thunk,Nock,我正在学习找到的Redux教程 在我创建的应用程序中,我有一个带有副作用的操作,正如receivePosts函数中调用Date.now()时所示 副作用在异步函数完成后触发。在我自己的应用程序中进行跟踪时。我得到的答复如下: actual: { type: 'REQUEST_LEAGUE_SUCCESS', receivedAt: 1453991947254, league: 'Div 3', resultsTable: [ [Object], [Object] ] },

我正在学习找到的Redux教程

在我创建的应用程序中,我有一个带有副作用的操作,正如receivePosts函数中调用Date.now()时所示

副作用在异步函数完成后触发。在我自己的应用程序中进行跟踪时。我得到的答复如下:

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] ]
}
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 ...', () => { ... });
});
我预期行动的日期与实际行动的日期不相等。在我预期的行动中,我有以下几点:

receivedAt: Date.now()
我的代码的结构与Redux教程中的代码完全相同,只是我的action creator有这个副作用


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

我认为你需要在测试中增加一些容忍度,因为在发出操作和收到响应之间不可避免地会经过一段时间。即使你伪造了它,执行时间也会有所不同。您实际如何执行此操作取决于您的断言库

我认为您需要在测试中加入一些容忍度,因为在发送操作和接收响应之间不可避免地要经过一段时间。即使你伪造了它,执行时间也会有所不同。您实际如何执行此操作取决于您的断言库

依赖于获取当前时间的测试代码不是一个好主意。你需要重写一些东西,这样你就可以模拟或注入一个日期。在()。这篇文章是基于C语言的,但这里也适用相同的概念。

依赖于获取当前时间的测试代码不是一个好主意。你需要重写一些东西,这样你就可以模拟或注入一个日期。在()。这篇文章是基于C语言的,但在这里也适用相同的概念。

您可以模拟Date.now()函数,如下所示:

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] ]
}
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 ...', () => { ... });
});
您可以模拟Date.now()函数,如下所示:

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] ]
}
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 ...', () => { ... });
});