gpt4 book ai didi

angular - 在服务中使用 observables 测试错误案例

转载 作者:太空狗 更新时间:2023-10-29 16:53:35 25 4
gpt4 key购买 nike

假设我有一个订阅服务功能的组件:

export class Component {

...

ngOnInit() {
this.service.doStuff().subscribe(
(data: IData) => {
doThings(data);
},
(error: Error) => console.error(error)
);
};
};

订阅调用采用两个匿名函数作为参数,我已经设法为数据函数设置了一个工作单元测试,但 Karma 不会接受错误函数的覆盖。

enter image description here

我试过监视 console.error 函数,抛出一个错误,然后期望 spy 被调用,但并没有完全做到。

我的单元测试:

spyOn(console,'error').and.callThrough();

serviceStub = {
doStuff: jasmine.createSpy('doStuff').and.returnValue(Observable.of(data)),
};

serviceStub.doStuff.and.returnValue(Observable.throw(

'error!'
));

serviceStub.doStuff().subscribe(

(res) => {

*working test, can access res*
},
(error) => {

console.error(error);
console.log(error); //Prints 'error!' so throw works.
expect(console.error).toHaveBeenCalledWith('error!'); //Is true but won't be accepted for coverage.
}
);

测试此类匿名函数的最佳实践是什么?确保测试覆盖率的最低限度是多少?

最佳答案

您可以简单地模拟 Observable 抛出错误对象,如 Observable.throw({status: 404}) 并测试 observable 的错误 block 。

const xService = fixture.debugElement.injector.get(SomeService);
const mockCall = spyOn(xService, 'method').and.returnValue(Observable.throw({status: 404}));

2019 年更新:

既然有些人懒得看评论让我把这个放在这里:为 Rxjs 使用错误是最佳实践

import { throwError } from 'rxjs'; // make sure to import the throwError from rxjs
const xService = fixture.debugElement.injector.get(SomeService);
const mockCall = spyOn(xService,'method').and.returnValue(throwError({status: 404}));

2022 年更新:以上述方式使用 throwError 已被弃用。相反,使用 throwError(() => new Error({status: 404})):

import { throwError } from 'rxjs'; // make sure to import the throwError from rxjs
const xService = fixture.debugElement.injector.get(SomeService);
const mockCall = spyOn(xService,'method').and.returnValue(throwError(() => new Error({status: 404})));

关于angular - 在服务中使用 observables 测试错误案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39960146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com