我正在通过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教程中的代码完全相同,除了我的动作创建者有这种副作用。
我的问题归结为:我如何处理这些副作用以使我的测试通过?
答案 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)
我认为您需要在测试中建立一些容忍度,因为在调度操作和接收响应之间不可避免地会花费一些时间。即使你假装它,执行时间仍然会有所不同。你实际上如何做这取决于你的断言库。