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
相关产品推荐
相关产品推荐

