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

时间:2017-06-30 15:45:28

标签: unit-testing reactjs ecmascript-6 redux redux-saga

我使用expectSaga(&#39; redux-saga-test-plan&#39;)来测试我的一个传奇,我想知道如何测试在同一个传奇中进行的多次调用。< / p>

Sagas.js

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 }
    );
  }
}

单元测试

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();
    })
})

显然有#34;电话&#34;传递给提供()的同一对象中的属性两次不起作用,但是两次调用提供()并不能解决问题。有什么建议吗?

由于

1 个答案:

答案 0 :(得分:2)

根据documentation

,您可以提供多个来电
params = {
  'A': 'sum',
  'B': 'sum',
  'C': 'count',
  'D': 'sum',
  'F': (lambda x: list(x.unique()))
}
df_ = df.groupby('E').agg(params).reset_index()

或者如果您懒惰而又不想指定参数:

.provide([ // this external array is actually optional
  [call(executeFetch, arg), koResponse],
  [call(sharedUtilToExtractErrors, serverError), serverError.message],
])

这两个都没有为我工作,但由于某种原因它没有嘲笑依赖关系,仍然称它们导致错误。

我使用动态提供商

解决了问题
import * as matchers from 'redux-saga-test-plan/matchers';

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