Angular 测试抛出错误

Angular test throwError

我在 angular 中进行测试时遇到了一些困难。

我在服务中有一个功能是这样的:

 public getConfigFromData(conf: string, data: any): Observable<any> {
    if (!conf) {
      return throwError(`Error`);
    } else if (data) {
      return this.getConfig(conf, data);
    } else {
      return throwError('Other error');
    }
  }

我在测试抛出的错误时遇到了一些问题。 这是以下测试:

it('...', () => {
    expect(() => {
      service.getConfigFromData(null, '');
    }).toThrowError('Error');
  });

我从 jasmine 得到的错误是

Error: Expected function to throw an Error.

我一直在其他答案中寻找,但没有得出任何结论。 谁能猜出我错过了什么或做错了什么? 非常感谢您。

我认为 throwError returns 一个 observable 并且你需要 subscribe 到 observable 起飞的方法。

试试这个:

it('...', (done: DoneFn) => {
      service.getConfigFromContext(null, '').pipe(take(1)).subscribe({
      next: () => {},
      // subscribe, make assertion in the error block and call done to
      // let jasmine know you're done with the unit test
      error: (error) => { expect(error).toBeTruthy(); done(); }
   });

  });

我认为 .toThrowError 适用于 throw new Error('error'); 的常规 JavaScript。

返回的 throwErrorObservable<never> 类型的 Observable,订阅后会立即出现指定的错误。因此,为了使您的测试工作,您必须订阅 Observable 或者可以简单地将其转换为 Promise 以查看抛出的错误。这可以使用 async/await 来完成,如下所示:

it('#getConfigFromData should throw Error', async () => {
  try {
     await getConfigFromData(null, '').toPromise().then(() => null);
     fail('should have thrown Error')
  } catch (error) {
     expect(error).toBe('Error')
  }
});