角度服务中 catcherror 管道函数的单元测试

6 unit-testing karma-jasmine jestjs angular angular-unit-test

我尝试了解如何测试这个功能。从(err)=>{ line,它显示为一个未覆盖的声明。 服务.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);
      })
   );
}
Run Code Online (Sandbox Code Playgroud)

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

服务规范

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

IAf*_*sov 1

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

您利用 HttpTestingModule 进行测试做得非常出色。它也允许您轻松测试错误。相反,req.flush您可以使用该req.error方法来模拟 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);
});
Run Code Online (Sandbox Code Playgroud)

请查看Error handling这篇好文章的部分:测试 Angular HTTP 通信。这对于其他一些场景也有帮助。

  • 我尝试了这段代码,但在 req.error 行中,它抛出此错误““Error”类型的参数不能分配给“ErrorEvent”类型的参数。类型“Error”缺少类型“ErrorEvent”中的以下属性:colno、error、filename、lineno 和 22 more.ts(2345)` (2认同)
  • 你好,Sakthy,我已经对答案进行了编辑,只要 @IAfanasov 接受它,你就会得到正确的答案。直到此时尝试控制台 throwedError 以及 mockError 对象。 (2认同)