用于测试的玩笑,Redux-Saga
假设我有这样的故事:
export function* callCreateTemplate({payload}){
try{
...
yield delay(1500)
...
}不要因为这个延迟(1500)与API有关而对我进行评判。
然后,我在Jest中有我的测试用例,在那里我用runSaga调用了传奇:
it('...'), async () => {
...
await runSaga(...);
expect(dispatchedActions).toHaveLength(3);
}dispatchedActions是模拟的一部分,是一个数组,包含saga执行的所有分派动作。
问题是,当我删除saga中的延迟(1500)时,测试用例工作得很好,但是当我使用延迟(1500)执行测试时,延迟后的分派操作不会执行。
我如何使测试用例等待传奇的执行?
发布于 2022-04-11 03:32:26
runSaga返回一个具有task.toPromise()方法的任务对象。您应该将任务转换为承诺,以便可以使用async/await等待任务的完成。
此外,您还需要确保timeout参数在测试情况下的值大于delay效果中传递的毫秒。
import { runSaga } from 'redux-saga';
import { delay, put } from 'redux-saga/effects';
export function* callCreateTemplate({ payload }) {
yield delay(1500);
yield put({ type: 'CREATE_TEMPLATE', payload });
}
describe('callCreateTemplate', () => {
test('should pass', async () => {
const dispatchedActions: any[] = [];
await runSaga(
{
dispatch: (action) => dispatchedActions.push(action),
getState: () => ({}),
},
callCreateTemplate,
{ payload: 'fake payload' },
).toPromise();
expect(dispatchedActions).toHaveLength(1);
expect(dispatchedActions).toEqual([{ type: 'CREATE_TEMPLATE', payload: 'fake payload' }]);
}, 2000);
});测试结果:
PASS redux-saga-examples packages/redux-saga-examples/src/stackoverflow/71787549/index.test.ts
callCreateTemplate
✓ should pass (1508 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 4.118 shttps://stackoverflow.com/questions/71787549
复制相似问题