【问题标题】:Testing redux-saga catch error handling with jest用 jest 测试 redux-saga catch 错误处理
【发布时间】:2018-07-02 16:32:23
【问题描述】:

我正在尝试测试我的错误处理操作是否在我的 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

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

【问题讨论】:

    标签: testing redux jestjs anonymous-function redux-saga


    【解决方案1】:

    重写你的传奇以使用call effect;

    function* createMenu({ values }) {
        try {
            do some stuff...
        } catch (err) {
            const action = yield call(displayApiError, err)
            yield put(action);
        }
    }
    

    现在可以测试了

    const saga = createMenu(mockAction);
    const mockError = 'err';
    const mockActiom = {};
    
    it('calls displayApiError()', () => {
        saga.next();
        let result  = saga.throw(mockError);
    
        // now you are actually testing that displayApiError been called
        // not that the event was dispatched
        expect(result.value).toEqual(call(displayApiError, mockError));
    
        // test for dispatch if necessary
        result = saga.next(mockAction);
        expect(result.value).toEqual(put(mockAction));
    });
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      注意将expect.any(Function) 传递给call 等一些传奇效果可能会在它们断言类型时引发。

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

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

      【讨论】:

        猜你喜欢
        • 2018-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-22
        • 2019-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多