首页 > 解决方案 > 测试 Redux Saga。预期有效负载,但收到未定义

问题描述

我正在学习为 sagas 编写测试。我还有下一个传奇:

export function* searchTemplatesSaga(
  action: ReturnType<typeof searchTemplates>,
): SagaIterator {
  try {
    yield put(startLoading(searchTemplates));

    const { data: templates }: AxiosResponse<Paginated<Template>> = yield call(
      searchTemplatesRequest,
      {},
      action.payload,
    );

    yield put(setTemplates(templates));
  } catch (error) {
    yield put(appError({ error }));
  } finally {
    yield put(stopLoading(searchTemplates));
  }
}

我的测试看起来像这样:

  it('', () => {
    const saga = searchTemplatesSaga(searchTemplates(mockSearchTemplate));

    expect(saga.next().value).toEqual(put(startLoading(searchTemplates)));

    expect(saga.next().value).toEqual(call(
      searchTemplatesRequest,
      {},
      searchTemplates(mockSearchTemplate).payload,
    ));

    expect(saga.next(mockTempl).value).toEqual(put(setTemplates(mockTempl)));

    ...
  });

问题是第一次调用next()和第二次调用next()测试通过,而put(setTemplates(mockTempl))对应的第三次调用next()失败。

在此处输入图像描述

请帮我弄清楚可能是什么问题。为什么接受的有效载荷未定义?我正在将数据传递给 next() 调用。

标签: reduxredux-saga

解决方案


我认为您需要将您的 mockTempl 参数移动到您断言调用效果的早期 saga.next() 调用。

我强烈建议您转向测试 saga 的 run saga 模式。它更具可预测性,您可以使用 jest 模拟 axios。 https://redux-saga.js.org/docs/advanced/Testing.html


推荐阅读