在 Redux 操作中测试副作用
Test side effects in Redux actions
我正在学习找到的 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 教程中的代码完全相同,除了我的 action creator 有这个副作用。
我的问题归结为:如何处理这些副作用以使我的测试通过?
我认为您需要在测试中建立一定的容忍度,因为在调度操作和接收响应之间不可避免地会经过一些时间。即使你伪造它,执行时间仍然会有差异。您实际如何着手执行此操作取决于您的断言库。
依赖抓取当前时间的测试代码不是一个好主意。您需要重写一些东西,以便您可以模拟或注入日期。在 (Unit Tests, How to Write Testable Code and Why it Matters) 上有一些很好的例子。那篇文章是基于 C# 的,但同样的概念也适用于此。
你可以像这样模拟 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 ...', () => { ... });
});
我正在学习找到的 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 教程中的代码完全相同,除了我的 action creator 有这个副作用。
我的问题归结为:如何处理这些副作用以使我的测试通过?
我认为您需要在测试中建立一定的容忍度,因为在调度操作和接收响应之间不可避免地会经过一些时间。即使你伪造它,执行时间仍然会有差异。您实际如何着手执行此操作取决于您的断言库。
依赖抓取当前时间的测试代码不是一个好主意。您需要重写一些东西,以便您可以模拟或注入日期。在 (Unit Tests, How to Write Testable Code and Why it Matters) 上有一些很好的例子。那篇文章是基于 C# 的,但同样的概念也适用于此。
你可以像这样模拟 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 ...', () => { ... });
});