Javascript 测试Redux操作中的副作用
我正在学习找到的Redux教程 在我创建的应用程序中,我有一个带有副作用的操作,正如receivePosts函数中调用Date.now()时所示 副作用在异步函数完成后触发。在我自己的应用程序中进行跟踪时。我得到的答复如下: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] ] },
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 ...', () => { ... });
});