#ngrx #ngrx-effects #ngrx-test
#ngrx #ngrx-эффекты #ngrx-тест
Вопрос:
это мой первый подход к эффектам модульного тестирования, и я не знаю, как написать тест для моего эффекта, зависящего от хранилища, вот код эффекта:
validaCellulare$ = createEffect(() =>
this.actions$.pipe(
ofType(checkPIvaSuccess, inviaOtpIntent),
concatMap(action => of(action).pipe(
withLatestFrom(this.onboardingSelector.modelStep1$)
)),
exhaustMap(([action, datiStep1]) =>
this.onboardingService.postValidateCellulare(datiStep1.cellulare, OnboardingFactory.getCellulareWidgetId(this.centricoState.widgetStep1)).pipe(
map((res) => {
if (!!res amp;amp; res.result.status === ApplicationParams.StatusResponse.success) {
if (action.type === checkPIvaSuccess.type) {
this.modalService.open(ApplicationParams.templateNames.OTP, {
isClosable: false
});
}
return inviaOtpSuccess();
}
return action.type === checkPIvaSuccess.type ? errorThrowing({statusCode: res.result.statusCode}) : inviaOtpIntentError();
}
),
catchError(() => of(inviaOtpIntentError()))
)
)
));
Выше моего модульного теста:
it('checkPIvaSuccess should dispatch inviaOtpSuccess, on success call postValidateCellulare and open modal OTP', () => {
store.setState({onboarding: {modelStep1: {partitaIva: '12345678960', email: 'fasdfa@sdf.ati', cellulare: '1204014001', flagPrivacy: true}}});
const mockResponse = Mock.onboarding.validate.cellulare[1].body;
const action = checkPIvaSuccess({guid: '1592314141805665835746662667089'});
const completion = inviaOtpSuccess();
actions$ = hot('a', {a: action});
const response = cold('(a|)', {a: mockResponse});
const expected = cold('b', {b: completion});
onboardingService.postValidateCellulare = jest.fn(() => response);
expect(effects.validaCellulare$).toBeObservable(expected);
expect(modalService.open).toHaveBeenCalledWith(ApplicationParams.templateNames.OTP, {isClosable: false});
});
Отладка этого кода в тестовой среде выглядит как заблокированный внутри concatMap и немедленно останавливается без вызова внутреннего вызова сервера postValidateCellulare. Кто-нибудь может мне помочь, пожалуйста?
————— РЕДАКТИРОВАТЬ ТЕПЕРЬ ЭТО РАБОТАЕТ ————-
Благодаря @BenLesh я дважды проверяю свой код и не могу установить свой appKeyStore = 'entityCache'
. Итак, замена спецификации следующим образом полностью работает:
it('checkPIvaSuccess should dispatch inviaOtpSuccess, on success call postValidateCellulare and open modal OTP', () => {
store.setState({[appStoreKey]: {onboarding: {modelStep1: {partitaIva: '12345678960', email: 'fasdfa@sdf.ati', cellulare: '1204014001', flagPrivacy: true}}}});
const mockResponse = Mock.onboarding.validate.cellulare[1].body;
const action = checkPIvaSuccess({guid: '1592314141805665835746662667089'});
const completion = inviaOtpSuccess();
actions$ = hot('a', {a: action});
const response = cold('(a|)', {a: mockResponse});
const expected = cold('b', {b: completion});
onboardingService.postValidateCellulare = jest.fn(() => response);
expect(effects.validaCellulare$).toBeObservable(expected);
expect(modalService.open).toHaveBeenCalledWith(ApplicationParams.templateNames.OTP, {isClosable: false});
});
Комментарии:
1.
this.onboardingSelector.modelStep1$
По какой-то причине это не наблюдается в вашем тесте. Я бы установил там точку останова и проверил это.2. Спасибо @BenLesh, я проверяю 2 раза и замечаю, что мне не хватает ключа app store «EntityCache», поэтому, если я вызываю setState следующим образом, он работает!