首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开玩笑的测试不会等到传奇故事结束

开玩笑的测试不会等到传奇故事结束
EN

Stack Overflow用户
提问于 2022-04-07 18:54:07
回答 1查看 420关注 0票数 0

用于测试的玩笑,Redux-Saga

假设我有这样的故事:

代码语言:javascript
复制
export function* callCreateTemplate({payload}){
try{
  ...
  yield delay(1500)
  ...
}

不要因为这个延迟(1500)与API有关而对我进行评判。

然后,我在Jest中有我的测试用例,在那里我用runSaga调用了传奇:

代码语言:javascript
复制
it('...'), async () => {
   ...
   await runSaga(...);
   expect(dispatchedActions).toHaveLength(3);
}

dispatchedActions是模拟的一部分,是一个数组,包含saga执行的所有分派动作。

问题是,当我删除saga中的延迟(1500)时,测试用例工作得很好,但是当我使用延迟(1500)执行测试时,延迟后的分派操作不会执行。

我如何使测试用例等待传奇的执行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-11 03:32:26

runSaga返回一个具有task.toPromise()方法的任务对象。您应该将任务转换为承诺,以便可以使用async/await等待任务的完成。

此外,您还需要确保timeout参数在测试情况下的值大于delay效果中传递的毫秒。

代码语言:javascript
复制
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);
});

测试结果:

代码语言:javascript
复制
 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 s
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71787549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档