我正在接管现有的 Angular 应用程序。在其中,我一直看到许多组件中模板中使用的值实际上是一个用 getter/setter 屏蔽的属性,没有任何额外的逻辑:
<input type="number" [(ngModel)]="age" [disabled]="formDisabled">
get formDisabled() {
return this._formDisabled;
}
set formDisabled(value: boolean) {
this._formDisabled = value;
}
Run Code Online (Sandbox Code Playgroud)
我们的应用程序有性能目标。在 AngularJS 中,模板中的任何函数都会影响性能,因为它必须被计算(甚至只是为了返回值)。在 Angular(现在是 5)中它仍然是真的,如果我遇到它们,我应该用直接字段替换那些无用的访问器吗?
谢谢。
我有一个组件,最终通过连续调用一堆 HTTP 服务switchMap来从后端获取数据。
我想测试错误处理部分。该应用程序具有全局错误处理 (ErrorHandler) 和通过 catchError 进行的本地错误处理。
测试方法如下所示:
public methodUsingObservable() {
this.someRequest()
.pipe(catchError((error) => this.handleError(error)))
.subscribe(console.log);
}
Run Code Online (Sandbox Code Playgroud)
处理错误检查错误是否链接到业务操作,并再次抛出以由全局处理程序处理
handleError(error) {
checkLocally(error);
return throwError(error);
}
Run Code Online (Sandbox Code Playgroud)
对于我的测试,我模拟someRequest了throwError后端调用的问题
it('should handle the error when one occurs', fakeAsync(() => {
const service: MachinService = TestBed.get(MachinService);
spyOn(service,'someRequest').and.returnValue(throwError(new Error("Failing HTTP call")));
spyOn(service,'handleError').and.callThrough();
service.methodUsingObservable();
tick();
expect(service.methodUsingObservable).toThrowError();
expect(service.handleError).toHaveBeenCalled();
}));
Run Code Online (Sandbox Code Playgroud)
然而,无论我如何监视和期望某些东西,Karma 都会认为测试失败,因为订阅正如实际预期的那样,抛出了未处理的错误。
我尝试过:
expect(service.methodUsingObservable).toThrowError();
expect(service.methodUsingObservable()).toThrowError();
expect(() => service.methodUsingObservable()).toThrowError();
Run Code Online (Sandbox Code Playgroud)
但似乎没有人教系统接受测试成功,并且测试失败。
Chrome 62.0.3202 (Windows 10.0.0) MachinService should handle the error when one occurs FAILED
Error: …Run Code Online (Sandbox Code Playgroud)