rxjs макет ответа в трубу / кран - PullRequest
0 голосов
/ 06 февраля 2019

Я работаю над юнит-тестами для приложения Angular 7.1.Мы используем rxjs 6.3.3.Мой компонент имеет вызов службы, который выглядит следующим образом.

this.registrationservice
            .createAccount(model)
            .pipe(
                tap(
                    (resp: {}) => {
                        this.router.navigate([url]);
                    },
                    (error: any) => {
                        this.isError = true;
                        this.registrationState.resetData();
                        this.resetUrl = this.registrationState.verifyStepState(RegistrationStepName.confirm);
                    }
                ),
                finalize(() => {
                    this.isLoading = false;
                })
            )
            .subscribe();

Когда я пытаюсь вернуть ответ об ошибке, он никогда не попадает в обработчик ошибок .tap?Как мне это высмеять?Вот мой тест

it("Register User error", fakeAsync(() => {
        let errorResponse = {
            statusCode: "400",
            error: "no good"
        };
        userRegisterSvcStub.createAccount.and.throwError(ErrorObservable.create(errorResponse));
        let model = new UserRegisterModel({ userregistrationtypeid: modelProviderType.id, ...modelNpi, ...modelCreateAccount });
        registerDataStateSpy.getRegisterUserData.and.returnValue(model);
        registerDataStateSpy.verifyStepState.and.returnValue("../beginning");
        component.ngOnInit();
        tick();
        expect(mockRouter.navigate).not.toHaveBeenCalled();
        expect(component.resetUrl).toEqual("../beginning");
    }));

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Более подробная информация об ответе Кристиана ...

Исходя из того, как вы его используете, я предполагаю, что userRegisterSvcStub является шпионским объектом, а createAccount() является шпионским методом для этого объекта?Если это так, то код, который вы сейчас используете здесь:

userRegisterSvcStub.createAccount.and.throwError(ErrorObservable.create(errorResponse));

фактически выдаст ошибку, используя метод jasmine throwError(), как описано здесь .

ЧтоЯ думаю, вы хотите использовать rxjs throwError, как предложил Кристиан.Для этого ваш код будет выглядеть примерно так:

import { throwError } from 'rxjs'; // up with your other imports

userRegisterSvcStub.createAccount.and.returnValue(throwError(errorResponse));

Надеюсь, это поможет.

0 голосов
/ 06 февраля 2019

Вы можете использовать оператор throwError из rxjs, чтобы создать Observable, который немедленно выбрасывает все, что вы передали в функцию.

...