У меня небольшие проблемы с проверкой моей саги.Проблема связана с тем, что при запуске саги редуктор установлен на 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',
...
}