Модульное тестирование. Редуктор не меняет состояние после отправки действия
Я пытаюсь выполнить простой тест редуктора. новый StartLoading(); отправляется, это должно установить для isLoading значение true. К сожалению, он показывает: Ожидаемое значение $.isLoading = false равно true.
Ничего фантастического. Вот как выглядит тест:
it('should set isLoading to true', () => {
const isLoading = true;
const action = new StartLoading();
const newState = uiReducers(initialState, action);
const expectedState = { ...initialState, isLoading };
expect(newState).toEqual(expectedState);
})
И редуктор:
export interface UIState {
isLoading: boolean;
}
export const initialState: UIState = {
isLoading: false
};
export function uiReducers(state = initialState, action: UIActions) {
switch (action.type) {
case UIActionTypes.START_LOADING: {
console.log('stt')
return {
isLoading: true,
...state
};
}
case UIActionTypes.STOP_LOADING: {
return {
isLoading: false,
...state
};
}
default:
return {
...state
}
}
}
1 ответ
Я считаю, что проблема, с которой вы столкнулись, связана с порядком расположения элементов на object spread operator
.
Твой initialState
имеет isLoading = false
и вы устанавливаете его в правой части назначения объекта (помещая ...state
как вторая часть оператора). Это означает, что он всегда будет отменятьisLoading
что вы пытаетесь установить. Вы должны попробовать что-то вроде
case UIActionTypes.START_LOADING: {
console.log('stt')
return {
...state
isLoading: true,
};
}
Таким образом, вы говорите оператору использовать state
как объект-источник и изменить isLoading
свойство с новым значением.
Если вы проверите этот пример в документации, вы увидите, что состояние определено с левой стороны, а затем новые свойства с правой стороны (или внизу, если они находятся в нескольких строках)