在Angular 6中使用Observable捕获Promise拒绝错误

时间:2018-07-27 19:51:23

标签: javascript angular promise rxjs observable

我一直在尝试对包装Promise的Observable中的错误处理进行单元测试,而我似乎根本无法捕获到该错误。
我正在从一个承诺中设置一个可观察的对象,该承诺将被拒绝,然后从spyOn返回它。这适用于正确解决的诺言,但是在拒绝时,出现错误:“错误:未捕获(在诺言中):错误”

我的代码:

   it(
  'should not change status if unsucessful',
  fakeAsync(() => {

    const obs = from(
      new Promise(resolve => {
        return Promise.reject('error');
      })).pipe(catchError( (error) => {
        console.log('oh no');
        return of(error);
      }));

    spyOn(
      mockService,
      'ChangeStatusToAvailable'
    ).and.returnValue(obs);
    component.SetStatusToAvailable();
    tick(200);
    fixture.detectChanges();
    console.log(component._status);
    expect(component._status).toBe(AgentStatus[AgentStatus.disconnected]);
  })
);

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您的Promise的构建不正确。

请参见MDN

  

执行者
  与参数resolve和reject一起传递的函数。 executor函数由Promise实现立即执行,传递了res​​olve和reject函数(在Promise构造函数甚至返回创建的对象之前调用executor)。
  ...执行器的返回值被忽略。

在任何情况下,您都无需手动构建Promise(实际上是一种反模式)。试试:

const obs = from(Promise.reject('error'))