redux-saga-test-plan continueSaga- Тестирование редуктора с ветвью состояния - PullRequest
1 голос
/ 19 марта 2019

У меня небольшие проблемы с проверкой моей саги.Проблема связана с тем, что при запуске саги редуктор установлен на state: {...initialState}, тогда как мои саги select ожидают, что редуктор установлен на state: {authentication: {...initialState}}

Из-за этого я не могу полностьюпротестируйте комбинацию редуктор / сага, так как форма конечного состояния объекта не соответствует фактической форме магазина.

Тестируемая сага:

export default function* rootAuthenticationSaga() {
  while (true) {
      refreshToken = yield select((state: ApplicationRootState) => state.authentication.refreshToken);
      ... more code here
}

Один из моих тестовследующим образом:

    test('logs the user in if they provide a valid email and password', () => {
      const mockRefreshPoller = createMockTask();
      const initialState = {
        accessToken: '',
        refreshToken: '',
        userId: '',
      }
      return expectSaga(rootAuthenticationSaga)
        .withReducer(authenticationReducer, initialState)
        .provide([
          // some mock providers set up here
        ])
        // ...more asserts here
        .put(authenticationActions.saveTokens({accessToken: 'VALID_ACCESS_TOKEN', refreshToken: 'VALID_REFRESH_TOKEN'}))
        .hasFinalState({
           accessToken: 'VALID_ACCESS_TOKEN',
           refreshToken: 'VALID_REFRESH_TOKEN',
           userId: 'USER_ID',
        })
        .dispatch(authenticationActions.login.request({email: 'VALID_EMAIL', password: 'VALID_PASSWORD'}))
        .run()
    });

В вышеприведенном тесте select() терпит неудачу, поскольку правильный путь (с инжекцией через withReducer) находится в state.refreshToken, а не state.authentication.refreshToken

Если я ввожусостояние через withState({authentication: {refreshToken, ...}}), тогда select работает как положено, но все действия редуктора происходят с корнем состояния, при этом мое конечное состояние имеет (неправильную) форму:

{state: 
  authentication: {
    refreshToken: '',
    ...
  },
  refreshToken: 'VALID_REFRESH_TOKEN',
  ...
}

1 Ответ

1 голос
/ 19 марта 2019

Хитрость заключается в том, чтобы «смонтировать» рассматриваемый редуктор в правой «ветви», создав

const reducerUnderTest = createReducer({
  authentication: authenticationReducer,
})

и передав его в withReducer(reducerUnderTest, {authentication: {...initialState}} с правильным состоянием формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...