testing - 用 jest 测试 redux-saga 捕获错误处理
问题描述
我正在尝试测试当我的 saga 引发错误时调用我的错误处理操作。
这是我的传奇代码:
function* createMenu({ values }) {
try {
do some stuff...
} catch (err) {
yield put(displayApiError(err));
}
}
这是我的测试代码:
const saga = createMenu(mockAction);
const mockError = 'err';
it('calls displayApiError()', () => {
saga.next();
const result = saga.throw(mockError);
expect(result.value).toEqual(put(displayApiError(mockError)));
});
这就是我在开玩笑的输出中看到的:
● createMenu › Failure › calls displayApiError()
expect(received).toEqual(expected)
Expected value to equal:
{"@@redux-saga/IO": true, "PUT": {"action": [Function anonymous], "channel": null}}
Received:
{"@@redux-saga/IO": true, "PUT": {"action": [Function anonymous], "channel": null}}
Difference:
Compared values have no visual difference.
我假设这是Function anonymous
问题所在。我试过自己执行两个比较函数,它们都displayApiError
以相同的方式调用。
那么为什么测试仍然失败?
解决方案
的内容是displayApiError(mockError)
什么?好像您返回了一个 thunk 或匿名函数?Sagasput
使用简单的 redux 操作。
关于在 redux sagas 中测试匿名函数的一些一般想法:
如果您只关心断言效果而不是函数本身。
const callEffect = call(() => {}); callEffect.CALL.fn = expect.any(Function); expect(result.value).toEqual(callEffect);
注意传递expect.any(Function)
给一些 saga 效果,比如call
在断言类型时可能会引发。
检查值的内容,而不是直接在效果上使用 toEqual。
const fn = result.value.CALL.fn; const result = fn(); // then assert something about result
推荐阅读
- bigdata - 大数据结构
- git - Git如何签出提交进行一些更改并将其推送回相同的提交
- postgresql - PostgreSQL 空连接
- python - 包含 pybindIETFXMLEncoder 类的用户何时可以使用下一个 pyangbind 版本
- pine-script - PineScript - 为变量设置颜色输入
- minio - 分布式 MINIO 部署在池中复制服务器
- obfuscation - ConfuserEx 不加密
- stream - Cupy 流同步使用 with 语句
- mainframe - 使用 FTPS 将文件从大型机传输到 RedHat Linux 时出错
- c# - C#如何将变量从表单传递给userControl,反之亦然