Тестирование обработки ошибок приставки redux-saga с помощью jest - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь проверить, что мое действие по обработке ошибок вызывается, когда моя сага выдает ошибку.

Вот мой код саги:

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 одинаково.

Так почему же тест по-прежнему не проходит?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Перепишите свою сагу, чтобы использовать call эффект ;

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));
});
0 голосов
/ 05 июля 2018

Каково содержание displayApiError(mockError)? Похоже, что вы возвращаете Thunk или анонимную функцию? Sagas put работает с обычными редукционными действиями.

Несколько общих соображений по поводу тестирования анонимных функций в саксофонах редуксов:

  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
    
...