You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

redux-saga-test-plan中put动作类型断言失败,如何忽略payload?

Redux Saga测试:忽略Payload断言Toast动作触发

问题描述

使用redux-saga-test-plan测试Redux saga时,saga响应SomeActions.someAction会调用ToastActions.showToast,尝试断言该调用但put断言不匹配,仅需确认动作是否触发,不关心showToast的payload内容。

测试代码:

test("...", () => {
  return expectSaga(knockSaga)
    .withState(...)
    .provide(...)
    .put.actionType(ToastActions.showToast)
    .dispatch(SomeActions.someAction(...))
    .run();
});

报错信息:

SagaTestError: 
put expectation unmet:

Expected
--------
{
  action: {
    type: [Function: actionCreator] {
      toString: [Function (anonymous)],
      type: 'toast/showToast',
      match: [Function (anonymous)]
    }
  }
}

Actual:
------
1. {
  '@@redux-saga/IO': true,
  combinator: false,
  type: 'PUT',
  payload: {
    channel: undefined,
    action: {
      type: 'toast/showToast',
      payload: {
        ...
      }
    }
  }
}

解决方案

方法一:直接传入动作类型字符串

将.put.actionType(ToastActions.showToast)替换为传入动作的type字符串:

test("...", () => {
  return expectSaga(knockSaga)
    .withState(...)
    .provide(...)
    .put.actionType('toast/showToast')
    .dispatch(SomeActions.someAction(...))
    .run();
});

方法二:利用动作创建器的match方法

如果你的动作创建器是用@reduxjs/toolkit生成的(报错显示有match方法),可以通过断言动作是否匹配该类型来忽略payload:

test("...", () => {
  return expectSaga(knockSaga)
    .withState(...)
    .provide(...)
    .put(action => ToastActions.showToast.match(action))
    .dispatch(SomeActions.someAction(...))
    .run();
});

原因说明

报错是因为.put.actionType()方法需要接收动作类型字符串,而你传入了动作创建器函数。虽然动作创建器上包含type属性,但该方法无法正确识别函数类型的参数,导致预期与实际动作不匹配。

内容的提问来源于stack exchange,提问作者etnguyen03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:21:09