Angular 8 karma 从服务中测试 Observable 的成功和错误

Posted

技术标签:

【中文标题】Angular 8 karma 从服务中测试 Observable 的成功和错误【英文标题】:Angular 8 karma test both success and error of Observable from service 【发布时间】:2021-06-26 14:55:24 【问题描述】:

我正在测试 MyComponent,它在 ngOnInit 中调用一个返回 observable 的服务方法:

    this.myService.getMyData().subscribe(
        (data) => 
            //do something
        ,
        (error) => 
            //do something - error
        
    );

我在getMyData 上安装了一个间谍,这样:

mySpy = spyOn(myService, 'getMyData').and.returnValue(of(mockObject));

这涵盖了订阅的“成功分支”。但我还需要涵盖“错误分支”。我试过这样做:

spyOn(myService, 'getMyData').and.returnValue(throwError(new Error('Error')));

当然,Jasmine 告诉我getMyData 已经被监视了。如何覆盖两个分支?

【问题讨论】:

【参考方案1】:

您所做的是正确的,但是您不能在同一个测试用例中多次监视同一个服务。

因此您需要编写第二个测试用例来涵盖您的错误场景。

类似这样的:

it('should run success scenario', () => 
   mySpy = spyOn(myService, 'getMyData').and.returnValue(of(mockObject));
)

it('should run error scenario', () => 
   mySpy = spyOn(myService, 'getMyData').and.returnValue(throwError(new Error('Error')));
)

【讨论】:

嗨,谢谢,既然我在 beforeEach 中声明了我的间谍,我应该删除那里的声明并将其移动到每个测试用例中,对吧? 你也可以这样做。

以上是关于Angular 8 karma 从服务中测试 Observable 的成功和错误的主要内容,如果未能解决你的问题,请参考以下文章

模拟指令以测试组件 - Angular 8 与 jasmine 和 Karma

使用 Karma 测试 Angular 时选择性地模拟服务

使用 jasmine / karma 进行 Angular 4 单元测试和 http post mocking - 如何修复

使用 Karma 进行角度测试

Karma-coverage 检查 JS 文件中的测试覆盖率,而不是 Angular 2 中的 TS

Angular/Karma 单元测试错误“1 个计时器仍在队列中”