Тестирование эффекта NgRx Marbles возвращает странную ошибку
У меня есть приложение Angular 5, которое использует NgRx Effects. Один из эффектов обрабатывает регистрацию на веб-сайте, передавая введенные пользователем данные в серверную часть NodeJS. Эффект работает точно так, как и предполагалось, но когда я пытаюсь выполнить его модульное тестирование с помощью Marbles, я получаю странную ошибку.
Это Эффект:
@Effect()
authSignup$ = this.actions$
.ofType(AuthActions.TRY_SIGNUP)
.switchMap((signUpData: {
first_name: string,
last_name: string,
username: string,
password: string,
type: string,
agreement: boolean
}) =>
this.httpClient.post(
'/custom-endpoint',
{
first_name: signUpData.first_name,
last_name: signUpData.last_name,
username: signUpData.username,
password: signUpData.password,
type: signUpData.type,
agreement: signUpData.agreement
},
{
headers: new HttpHeaders({
'Content-Type': 'application/json'
})
})
.map((res) => {
return new AuthActions.SuccessfulSignup();
})
.catch((error: {reason: string}) => {
return Observable.of(new AuthActions.UnsuccessfulSignup({reason: error.reason}))
})
);
Это юнит-тест с мрамором. Это следует руководству Тодда Мотто для тестирования эффектов NgRx.
export class TestActions extends Actions {
constructor() {
super(empty());
}
set stream(source: Observable<any>) {
this.source = source;
}
}
export function getTestActions() {
return new TestActions();
}
fdescribe('AuthEffects', () => {
let actions$: TestActions;
let effects: fromEffects.AuthEffects;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
CookieModule.forRoot(),
StoreModule.forRoot({...fromGlobal.reducers}),
RouterTestingModule,
HttpClientTestingModule
],
providers: [
fromEffects.AuthEffects,
CookieAesService,
{ provide: Actions, useFactory: getTestActions },
],
});
actions$ = TestBed.get(Actions);
effects = TestBed.get(fromEffects.AuthEffects);
});
it('should attempt to Sign Up the user', () => {
const trySignup = new fromActions.TrySignup({
first_name: 'test',
last_name: 'test',
password: 'test',
username: 'test@test.com',
type: 'test',
agreement: false
});
const unsuccessfulSignup = new fromActions.UnsuccessfulSignup({ reason: 'test' });
actions$.stream = hot('a', { a: trySignup });
const expected = cold('b', { b: unsuccessfulSignup });
expect(effects.authSignup$).toBeObservable(expected);
});
});
Наконец, это ошибка, которую я получаю в Карме:
Expected $.length = 0 to equal 1.
Expected $[0] = undefined to equal Object({ frame: 0, notification: Notification({ kind: 'N', value: UnsuccessfulSignup({ payload: Object({ reason: 'test' }), type: 'UNSUCCESSFUL_SIGNUP' }), error: undefined, hasValue: true }) }).
Из этого довольно загадочного сообщения об ошибке я понимаю, что trySignup
действие было запущено, но не unsuccessfulSignup
действие. Кто-нибудь знает, почему это может происходить?
Спасибо!
0 ответов
Alex,
Ваш switchMap переключает поток на http.post
поток, который вы не заглушаете или не возвращаете. Вам нужно выдать ошибку от HttpClientTestingModule
сначала для catch
событие для огня.
Смотрите ссылку ниже для примера: