首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReactJs用expectSaga测试redux-saga中的多个调用

ReactJs用expectSaga测试redux-saga中的多个调用
EN

Stack Overflow用户
提问于 2017-06-30 15:45:28
回答 1查看 2.4K关注 0票数 1

我正在使用expectSaga ('残存-传奇-测试计划')来测试我的一个saga,我想知道如何测试在同一个传奇中发出的多个调用。

Sagas.js

代码语言:javascript
复制
export function* fetchSomething(arg){
  const response = yield call(executeFetch, arg);
  if(response.status === 200){
    // trigger success action
  } else if (response.status >= 400){
    const errResp = yield response.json();
    const errorCode = yield call(sharedUtilToExtractErrors, errResp);
    yield put(
      { type: 'FETCH_FAILED', errorMessage: UI_ERR_MSG, errorCode }
    );
  }
}

单元测试

代码语言:javascript
复制
import { expectSaga } from 'redux-saga-test-plan';

describe('fetchSomething', () => {

   // positive paths

   // ..

   // negative paths

   it('fetches something and with status code 400 triggers FETCH_FAILED with error message and extracted error code', () => {
     const serverError = { message: 'BANG BANG BABY!' };
     const koResponse = new Response(
       JSON.stringify(serverError),
       { status: 400, headers: { 'Content-type': 'application/json' } }
     );

     return expectSaga(fetchSomething)
        .provide(
          {
            call: () => koResponse,
            call: () => serverError.message,
          }
        )
        .put({
           type: 'FETCH_FAILED', errorMessage: UI_ERR_MSG, serverError.message
        })
        .run();
    })
})

显然,在同一个对象中传递两次“调用”属性以提供()不起作用,但同时调用provide()两次也不起作用。有什么建议吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2017-06-30 17:06:15

这就是如何根据文档提供多个调用

代码语言:javascript
复制
.provide([ // this external array is actually optional
  [call(executeFetch, arg), koResponse],
  [call(sharedUtilToExtractErrors, serverError), serverError.message],
])

或者如果您懒惰并且不想指定参数:

代码语言:javascript
复制
import * as matchers from 'redux-saga-test-plan/matchers';

.provide(
 [matchers.call.fn(executeFetch), koResponse],
 [matchers.call.fn(sharedUtilToExtractErrrors), serverError.message],
)

这两种方法对我都不起作用,但由于某种原因,它们没有模仿出依赖关系,仍然调用它们会导致错误。

我使用动态提供程序解决了问题。

代码语言:javascript
复制
.provide({
  // select(effect, next) { return 'something-for-a-selector' },
  call(effect) {
    switch(effect.fn.constructor.name) {
      case executeFetch.constructor.name: return koResponse;
      case sharedUtilToExtractErrors.constructor.name: return serverError.message;
      default: throw new Error('Unknown function called in test');
    }
  }
})
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44850371

复制
相关文章

相似问题

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