如何在Angular2测试中模拟Observable.throw?

如何在Angular2测试中模拟Observable.throw?

问题描述:

我想测试我的Angular2组件中的错误处理,因此想模拟一个服务来返回一个Observable.throw('错误')。如何使用Jasmine和Karma和Angular 2来完成?如何在Angular2测试中模拟Observable.throw?

+1

您能否给我们提供一个代码示例?为您的问题添加上下文,让我们提供准确的答案。 – Supamiu

您应该可以看到create,并且只需拨打观察员error即可。例如,

let mockService = { 
    error: false, 
    data: 'something', 
    getData:() => { 
    return Observable.create(observer => { 
     if (this.error) { 
     observer.error(new Error(..)) 
     } else { 
     observer.next(this.data); 
     } 
     observer.complete(); 
    }) 
    } 
} 

现在对于您的测试,您可以使用模拟成功案例和错误案例。对于错误情况,只需将error属性设置为true即可。在成功的情况下,next与数据一起被调用。

当您订阅可观察到的,你可以在调用observer.nextobserver.errorobserver.complete当过三回呼,successerror,并complete

service.getData().subscribe(
    (data) => {} // sucess 
    (error) => {} // error 
() => {}  // complete 
) 
observer

所以,相应的回调将被调用。

+0

我对这个有点麻烦。它是否在测试声明中,即“我”将属性设置为“true”?当我将属性设置为“true”时,在我设置的测试声明中没有找到更改。如果这有帮助,我可以将我的代码放在一个plnkr中。 – bmd

你可以简单地模拟像Observable.throw({status:404})这样的Observable throw错误对象,并测试observable的错误块。

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