rxjs模拟响应到管道/抽头

问题描述 投票:0回答:2

我正在单元测试的角度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 angular unit-testing rxjs karma-jasmine
2个回答
0
投票

让更多的细节,基督教的答案...

从你使用它的方式,我认为userRegisterSvcStub是间谍对象,createAccount()的是,对象上的间谍方法?如果是这样,那么你正在使用此代码:

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

使用茉莉throwError()方法实际上将抛出一个错误,如记录here

我想你想是使用rxjs throwError基督教建议。要做到这一点您的代码会是这个样子:

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

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

我希望这有帮助。


0
投票

您可以使用throwError运营商从rxjs创建一个可观察的是立刻抛出你传递给函数什么的。

© www.soinside.com 2019 - 2024. All rights reserved.