【发布时间】:2019-04-06 04:22:41
【问题描述】:
我正在 angular 4 中测试下面的调用函数。
import { Component, OnInit } from '@angular/core';
import { AppService } from './app.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
title = 'jasmine-error-test';
constructor(private appService: AppService) { }
ngOnInit(): void {
this.call();
}
call() {
return this.appService.load().subscribe((res) => {
this.title = res;
}, (err) => {
throw new Error('Failed');
});
}
}
为了测试从订阅中引发错误的部分,我正在执行以下操作。
describe('when call is called', () => {
describe('when the service returns an error', () => {
let app;
beforeEach(async(() => {
const fixture = TestBed.createComponent(AppComponent);
app = fixture.componentInstance;
(service.load as jasmine.Spy).and.returnValue(Observable.throw({
status: 406,
error: {
message: 'Test 406 error'
}
}));
}));
it('it should throw a matching error', async(() => {
expect(() => { app.call(); }).toThrowError('Failed');
}));
});
});
但测试失败并出现错误
Expected function to throw an Error.
如果我使用调试器窗口,它会显示抛出错误的行正在被击中,但我仍然没有让测试通过。谁能告诉我这是怎么回事。
【问题讨论】:
-
您的函数确实不会抛出任何错误。它订阅一个可观察对象,并且在您的函数返回很久之后,当错误 http 响应最终返回时,订阅时传递的错误回调会引发错误。抛出这个错误有什么意义?通过简单地让原始错误传播,您预计不会发生什么?
-
传播是什么意思?传播到哪里?这是我的组件,没有上游。在完整的项目中,存在一个有角度的应用程序级错误处理程序组件,旨在捕获任何未处理的错误并优雅地处理它。这就是我抛出错误的原因。
-
这是我的组件,没有上游。:因此我的问题是:抛出错误有什么意义,而不是让原始未处理的错误传播直到它到达您的应用程序级错误处理程序?您的句柄不会得到原始的、详细的 http 错误,而只会得到一个无意义的、神秘的错误,告诉“失败”。有什么意义?
标签: angular unit-testing angular-test