【问题标题】:Unit testing of catcherror pipe function in angular service角度服务中catcherror管道功能的单元测试
【发布时间】:2021-09-23 11:59:08
【问题描述】:

我尝试了解如何测试此功能。来自(err)=>{ line,,它显示为未覆盖的声明。 service.ts

Deletevote(inp) {
   console.log(inp);
     
   return this.http.post(environment.apiUrl + '/api/reset/abc', inp).pipe(
      catchError((err) => {
         console.log('error caught in service');
         console.error(err);
         return throwError(err);
      })
   );
}

我已经为正流创建了这个测试用例,但仍然没有涵盖错误部分。请指导我如何创建错误。

service.spec.ts

const Mockcolor = 'green';
const MockGen = 'male';

it('submitnominGreen', () => {
    service.Deletevote(DeleteObj).subscribe((posts) =>{
      expect(posts).toEqual([Mockcolor,MockGen], 'should check mock data');
    });
    const req =  httpTestCtrl.expectOne(environment.apiUrl + '/api/reset/abc');
    expect(req.request.method).toBe('POST');
    expect(req.cancelled).toBeFalsy();
    req.flush([Mockcolor,MockGen])
});

【问题讨论】:

  • 是的,但我应该如何为我的函数编写代码?
  • 他们的代码中没有管道图。
  • 您不能期望文档涵盖所有可能的使用代码。这显示了如何在测试中发生错误,然后您必须将其应用于您的特定情况。
  • 我是新的贡献者,我需要代码方面的帮助。单元测试没有太多参考资料。

标签: angular unit-testing jestjs karma-jasmine angular-unit-test


【解决方案1】:

首先,单元测试的subscribe里面的代码不会被执行。 Karma 将等待所有同步执行完成,并在执行异步回调之前认为测试已完成。作为一种解决方案,您可以使用done 回调来指示测试何时手动完成。

您在利用 HttpTestingModule 进行测试方面做得很好。它还允许您轻松测试错误。您可以使用req.error 方法代替req.flush 来模拟HTTP 错误。

it('submitnominGreen', (done) => {
    const mockError = {error: 'someError'} as ErrorEvent;
    service.Deletevote(DeleteObj).subscribe(() => {}, (thrownError) =>{
      expect(thrownError.error).toEqual(mockError);
      done();
    });
    const req =  httpTestCtrl.expectOne(environment.apiUrl + '/api/reset/abc');
    req.error(mockError);
});

查看这篇精彩文章的Error handling 部分:Testing Angular HTTP Communication。这对其他一些场景也有帮助。

【讨论】:

  • 我试过这段代码,但在 req.error 行它抛出这个错误Argument of type 'Error' is not assignable to parameter of type 'ErrorEvent'. Type 'Error' is missing the following properties from type 'ErrorEvent': colno, error, filename, lineno, and 22 more.ts(2345)
  • 现在这是错误。 Expected object to be a kind of Object, but was HttpErrorResponse({ headers: HttpHeaders({ normalizedNames: Map( ), lazyUpdate: null, headers: Map( ) }), status: 0, statusText: 'Unknown Error', url: 'http://localhost:3000/api/reset/abc', ok: false, name: 'HttpErrorResponse', message: 'Http failure response for http://localhost:3000/api/reset/abc: 0 ', error: Object({ error: 'someError' }) }).
  • 它开始看起来像 google 驱动的开发(:@Sakthy Rupini,这只是迈向解决方案的一小步。请阅读错误消息。
  • 我以为我必须将其作为 ErrorEvent 删除,但它不起作用。
  • 你好 Sakthy,我已经对答案添加了一个编辑,只要@IAfanasov 接受它,你就会得到正确的。直到时间尝试控制台 throwError 以及 mockError 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 2020-07-10
  • 2018-11-19
  • 1970-01-01
  • 2019-11-20
相关资源
最近更新 更多