2017-02-09 3 views
4

Я следил за документацией для Redux Sagas и создал набор тестов, однако они кажутся мне очень хрупкими. Всякий раз, когда я обновляю логику в любом из моих саг, мои тесты терпят неудачу. Это вызывает тревогу в моей голове и заставляет меня думать, что я делаю что-то неправильно.Unit Testing Redux Sagas

Вот пример сага, которая обменивается данными с API, чтобы загрузить профиль пользователя и сохранить его в состоянии Redux:

export function* userAuthCheck() { 
    try { 
     yield put({ type: START_HTTP }); 

     const me = yield apply(user, user.me); 
     const organisations = yield apply(user, user.organisations, [me.body.data.id]); 

     yield put({ 
      type: USER_AUTH_SUCCESS, 
      redirect: true, 
      state: { 
       account: me.body.data, 
       organisations: organisations.body.data, 
      }, 
     }); 
    } catch (error) { 
     yield put({ type: USER_AUTH_REFRESH }); 
    } finally { 
     yield put({ type: COMPLETE_HTTP }); 
    } 
} 

Вот соответствующий тест:

it('can successfully call the API',() => { 
    const generator = userAuthCheck(); 

    expect(generator.next().value).toEqual(put({ type: START_HTTP })); 
    expect(generator.next().value).toEqual(call(user.me)); 

    expect(generator.next().value).toEqual(put({ 
     type: USER_AUTH_SUCCESS, 
     state: { user: undefined }, 
    })); 

    expect(generator.next().value).toEqual(put({ type: COMPLETE_HTTP })); 
}); 

Вы могли бы заметить, что тест будет действительно терпеть неудачу, если вы запустите, потому что я не обновил его, так как я сделал некоторые последние обновления для саги. Это то, что начало меня на этом пути мысли.

Есть ли лучший способ проверить мои саги? Можно ли запускать их от начала до конца, издеваться над различными ответами API и утверждать, что правильные вещи отправляются в состояние?

Эти документы я следующие: https://redux-saga.github.io/redux-saga/docs/introduction/BeginnerTutorial.html

+3

Возможно, это могло бы помочь: https://github.com/jfairbank/redux-saga-test-plan – jkrnak

+1

Это выглядит великолепно - похоже, я могу довольно легко моделировать ответы с помощью 'next()', но мне все равно понадобится обновлять тесты каждый раз, когда я вношу изменения в сагу. Возможно, это неизбежно при использовании функций генератора и 'yield'. – edcs

ответ

1

Существует длинный выпуск нить об этом в выпуске трекера перевождь-Саге для issue #518. Поэтому нет согласованного правильного способа тестирования, однако есть несколько вариантов, и я бы сказал, что лучший подход может зависеть от того, что именно вы тестируете.

Есть несколько тестов вспомогательных пакетов, указанных в приведенной выше нити там нравится:

Есть также несколько хороших примеров в the redux-saga test suite, чтобы учиться.

1

Мне нравится испытывать его насмешливый магазин, поэтому для примера, было бы что-то вроде:

import configureMockStore from "redux-mock-store"; 
import createSagaMiddleware from "redux-saga"; 
import rootSaga from "pathToRootSaga/rootSaga"; 
import {userAuthCheckActionCreator} from "yourPath/UserActionCreators"; 

it('can successfully call the API',() => { 
    const sagaMiddleware = createSagaMiddleware(); 
    const mockStore = configureMockStore([sagaMiddleware]); 
    const store = mockStore({}); 
    sagaMiddleware.run(rootSaga); 

    const expectedActions = [ 
    { 
     type: START_HTTP 
    }, 
    { 
     type: USER_AUTH_SUCCESS, 
     redirect: true, 
     state: { 
      account: me.body.data, 
      organisations: organisations.body.data, 
     } 
    }, 
    { 
     type: COMPLETE_HTTP 
    } 
    ]; 

    store.dispatch(userAuthCheckActionCreator()); 
    expect(store.getActions()).toEqual(expectedActions); 
}); 

Что мне нравится в этом подходе является то, что я могу ясно видеть, если вся последовательность действий является получая отправленный в ожидаемом порядке. Кроме того, все происходит в контексте издевательского хранилища, позволяющего промежуточному программному обеспечению Saga отправлять действия, поэтому вам не нужно манипулировать функцией генератора.