Я работаю над модульными тестами для приложения 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");
}));



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать оператор throwError из rxjs для создания Observable, который немедленно выбрасывает все, что вы передали функции.
Предоставление более подробной информации ответу Кристиана...
Судя по тому, как вы его используете, я предполагаю, что 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));
Надеюсь, это поможет.
Плохо... Это работает!... в одном из моих других шпионских звонков все еще были имитированы предыдущие данные, поэтому они не достигли моего кода... нужно больше кофе... ура!
Спасибо, но, к сожалению, он все еще переходит в блок «успех» в кране ... пытаясь выяснить, что я могу дать макету, чтобы он признал, что это ошибка, а не успех