【问题标题】:testing redux saga callback function测试 redux saga 回调函数
【发布时间】:2020-06-18 04:40:45
【问题描述】:

在saga函数中,成功后,我正在做一个回调。我试图在测试中涵盖这一点,但它没有被涵盖。谁能提出一些涵盖这些领域的方法。

export function* submitSavedDataWorker(action) {
      try {
        const response = yield call(suggestFunction, action.payload);
        const { data } = action.payload;
        yield put({
          type: actionTypes.suggestType,
          payload: response.data,
          prevData: data,
        });
        if (action.successFn) {
          action.successFn(response.data);
        }
      } catch (error) {
        const { charityData } = action.payload;
        yield put({
          type: actionTypes.saveFailType,
          payload: error,
          prevData: data,
        });
      }
    }

我写过这样的测试用例:

describe('submitSavedDataWorker success', ()=> {
      const it = sagaHelper(
        submitSavedDataWorker({ payload: { data: 1234 }, successFn: ()=> { return 0 } })
      );
      it("should get error as result", (result) => {
        expect(result).toEqual(
          call(suggestFunction, { data: 1234 })
        );
        return {data: true};
      });
      it("should get success as result", (result) => {
        expect(result).toEqual(
          put({
            type: actionTypes.suggestType,
            payload: true,
            prevData: 1234,
          })
        );
      });
    });

【问题讨论】:

  • “不被覆盖”是什么意思?你是根据报道来判断的吗?它说什么? “覆盖那些领域” - 究竟是哪些领域?您可以从使用 Jest spy 作为 successFn 开始。
  • 是的,覆盖率报告显示: if (action.successFn) { action.successFn(response.data); } 未涵盖。
  • 您是否尝试使用间谍?

标签: redux jestjs redux-saga redux-saga-test-plan


【解决方案1】:

sagaHelper 在调用 it 时一次只将 saga 推进一个效果 - 因此生成器在产生 put 效果后停止执行。为了让 saga 运行完成(并因此执行未覆盖的行),it 需要再调用一次。您还可以检查结果是否为 undefined 以确保 saga 已运行完成,例如:

      it("should complete", (result) => {
        expect(result).toBeUndefined();
      });

加上这个,下面是完整的测试:

describe('submitSavedDataWorker success', ()=> {
      const it = sagaHelper(
        submitSavedDataWorker({ payload: { data: 1234 }, successFn: ()=> { return 0 } })
      );
      it("should get error as result", (result) => {
        expect(result).toEqual(
          call(suggestFunction, { data: 1234 })
        );
        return {data: true};
      });
      it("should get success as result", (result) => {
        expect(result).toEqual(
          put({
            type: actionTypes.suggestType,
            payload: true,
            prevData: 1234,
          })
        );
      });
      /* New code is here */
      it("should complete", (result) => {
        expect(result).toBeUndefined();
      });
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2022-01-15
    • 1970-01-01
    • 2020-12-21
    • 2021-11-21
    • 2019-08-15
    相关资源
    最近更新 更多