首页 > 解决方案 > 用 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以相同的方式调用。

那么为什么测试仍然失败?

标签: testingreduxjestjsanonymous-functionredux-saga

解决方案


的内容是displayApiError(mockError)什么?好像您返回了一个 thunk 或匿名函数?Sagasput使用简单的 redux 操作。

关于在 redux sagas 中测试匿名函数的一些一般想法:

  1. 如果您只关心断言效果而不是函数本身。

    const callEffect = call(() => {});  
    callEffect.CALL.fn = expect.any(Function);  
    expect(result.value).toEqual(callEffect);  
    

注意传递expect.any(Function)给一些 saga 效果,比如call在断言类型时可能会引发。

  1. 检查值的内容,而不是直接在效果上使用 toEqual。

    const fn = result.value.CALL.fn;  
    const result = fn();  
    // then assert something about result
    

推荐阅读