Angular 使用 jasmine 进行可观察错误部分单元测试
Angular Observable error part unit testing using jasmine
我的 angular 服务“config.service.ts”中有以下功能。我已经为此编写了一些单元测试用例,但我无法涵盖订阅方法的错误部分。
getConfiguration(params){
return new Promise((resolve, reject) => {
try {
this.httpService.post('getConfig', params).subscribe{
data => {
resolve(data);
},
error => {
reject(error);
}
};
} catch(error) {
reject(error);
}
});
}
下面是 'config.service.spec.ts' 代码。请让我知道如何覆盖订阅错误部分。
it('coverage for getConfiguration()', () => {
const service: ConfigService = Testbed.get(ConfigService);
const param = {id: 10};
const response = {success: true};
const httpService: HttpService = Testbed.get(HttpService);
spyOn(httpService, 'post').and.returnValue(of(response));
service.getConfiguration(param).then(function() {});
expect(service.getConfiguration).toBeTruthy();
});
这里可观察到的错误部分是没有覆盖,无法覆盖。如有不妥欢迎指正
要到达 Observable 的错误处理程序,您可以使用 RxJS throwError 强制 Observable 抛出。所以你的测试看起来像这样:
it('rejects when post throws', async () => {
const param = { id: 10 };
const errorResponse = new Error('httpService.post error');
spyOn(httpService, 'post').and.returnValue(throwError(errorResponse));
await service.getConfiguration(param).catch(err => {
expect(err).toBe('Subscribe error: httpService.post error');
});
});
Here's a StackBlitz 展示了这种方法。
此外,关于您在问题中发布的测试,如果那是您的实际测试代码,您应该知道这个 expect
:
expect(service.getConfiguration).toBeTruthy();
将始终通过,因为 service.getConfiguration
是一个函数,因此它的计算结果始终为真。如果您想以某种方式验证其行为,则需要调用该函数。
此外,我认为您发布的服务代码中的这一行有语法错误:
this.httpService.post('getConfig', params).subscribe{
在 .subscribe
之后,在大括号之前需要一个左括号:
this.httpService.post('getConfig', params).subscribe({
但我猜这只是构建问题时的复制粘贴错误。
我的 angular 服务“config.service.ts”中有以下功能。我已经为此编写了一些单元测试用例,但我无法涵盖订阅方法的错误部分。
getConfiguration(params){
return new Promise((resolve, reject) => {
try {
this.httpService.post('getConfig', params).subscribe{
data => {
resolve(data);
},
error => {
reject(error);
}
};
} catch(error) {
reject(error);
}
});
}
下面是 'config.service.spec.ts' 代码。请让我知道如何覆盖订阅错误部分。
it('coverage for getConfiguration()', () => {
const service: ConfigService = Testbed.get(ConfigService);
const param = {id: 10};
const response = {success: true};
const httpService: HttpService = Testbed.get(HttpService);
spyOn(httpService, 'post').and.returnValue(of(response));
service.getConfiguration(param).then(function() {});
expect(service.getConfiguration).toBeTruthy();
});
这里可观察到的错误部分是没有覆盖,无法覆盖。如有不妥欢迎指正
要到达 Observable 的错误处理程序,您可以使用 RxJS throwError 强制 Observable 抛出。所以你的测试看起来像这样:
it('rejects when post throws', async () => {
const param = { id: 10 };
const errorResponse = new Error('httpService.post error');
spyOn(httpService, 'post').and.returnValue(throwError(errorResponse));
await service.getConfiguration(param).catch(err => {
expect(err).toBe('Subscribe error: httpService.post error');
});
});
Here's a StackBlitz 展示了这种方法。
此外,关于您在问题中发布的测试,如果那是您的实际测试代码,您应该知道这个 expect
:
expect(service.getConfiguration).toBeTruthy();
将始终通过,因为 service.getConfiguration
是一个函数,因此它的计算结果始终为真。如果您想以某种方式验证其行为,则需要调用该函数。
此外,我认为您发布的服务代码中的这一行有语法错误:
this.httpService.post('getConfig', params).subscribe{
在 .subscribe
之后,在大括号之前需要一个左括号:
this.httpService.post('getConfig', params).subscribe({
但我猜这只是构建问题时的复制粘贴错误。