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

Ste*_*fan 15 jasmine karma-runner angular

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

Pau*_*tha 15

你应该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();
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

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

当您订阅可观察到的,可以通过三门回调success,errorcomplete

service.getData().subscribe(
  (data) => {}   // sucess
  (error) => {}  // error
  () => {}       // complete
)
Run Code Online (Sandbox Code Playgroud)

于是用observer,打电话时observer.next,observer.error,observer.complete,相应的回调将被调用.


小智 12

这是我使用Rxjs 6的解决方案

let mockService = {
  getData: () => {
    return of({data:'any data'});
  }
}

spyOn(mockService , 'getData').and.callFake(() => {
  return throwError(new Error('Fake error'));
});
Run Code Online (Sandbox Code Playgroud)

  • 这可以更短 `let mockService = { getData: of({data:'any data'})}; spyOn(mockService, 'getData').and.returnValue(throwError(ERROR_RESPONSE))` (6认同)

Ani*_*Das 9

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

const xService = fixture.debugElement.injector.get(SomeService);
const mockCall = spyOn(xService, 'xMethod')
                       .and.returnValue(Observable.throw({status: 404}));
Run Code Online (Sandbox Code Playgroud)

在这里,我抛出http 404的错误Observable.throw({status: 404})被嘲笑xMethodxSerive在我的测试.

  • 在Rxjs 6+中,“ Observable.throw”更改为静态运算符“ throwError”。 (4认同)