【问题标题】:catchError always gets called in HTTP unit testing在 HTTP 单元测试中总是调用 catchError
【发布时间】:2019-08-29 23:04:45
【问题描述】:

我有一个进行 HTTP 调用的服务,我正在尝试为它编写测试。我正在尝试测试的服务中的方法如下所示

// my.service.ts

setUserAgreement(accept: boolean): Observable<any> {
  const data = { accept };

  return this.http.post<any>(this.url, data, this.getHttpHeader('1'))
    .pipe(
      tap(x => this.logHttp(x)),
      map(x => this.parseHttp(x)),
      catchError(this.handleErrorInternal('setUserAgreement'))
    );
}

我的测试文件是这样的

import { TestBed, async } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';

import { myService } from './my.service';

describe('myService', () => {
  let service;
  let httpMock: HttpTestingController;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [ HttpClientTestingModule ]
    });

    service = TestBed.get(myService);
    httpMock = TestBed.get(HttpTestingController);
  });

  describe(`#setUserAgreement`, () => {
    const mockResponse = 'Mock response';

    afterEach(() => {
      httpMock.verify();
    });

    it(`should not call handleErrorInternal when the call resolves successfully`, async(() => {
      spyOn(service, 'handleErrorInternal');
      service.setUserAgreement(true).subscribe(() => {
        expect(service.handleErrorInternal).not.toHaveBeenCalled();
      });

      const req = httpMock.expectOne(service.url);
      req.flush(mockResponse, { status: 200, statusText: 'OK' });
    }));
  });
});

但是测试失败并显示消息Error: Expected spy handleErrorInternal not to have been called.

有人可以帮忙吗?

【问题讨论】:

  • 请检查您的this.logHttp(x)this.parseHttp(x) 方法在测试运行时是否抛出任何异常?如果是,请确保这些方法不会抛出任何异常。
  • 您应该在提供者数组中将您的服务指定给 TestBed。在导入数组之后,放一个逗号,然后是 providers: [myService] 的新行
  • @user2216584 感谢您的回复。我为服务注释掉了这些行,但测试仍然失败。
  • @dmcgrandle 感谢您的回复。我将服务添加到提供程序(我很惊讶它在没有它的情况下构建)。但问题仍然存在。
  • 嗯。将您的间谍更改为and.callFake,为其提供一个功能,该功能将控制台记录正在发送的错误。这应该给你一个关于它来自哪里的线索......另外,在订阅中接收响应(你当前忽略返回的内容)并 console.log 它以确保它是你所期望的。

标签: angular unit-testing rxjs jasmine


【解决方案1】:

我找到了问题,好像是这条线引起的

catchError(this.handleErrorInternal('setUserAgreement'))

这样做可以解决问题

catchError(x => {
  this.handleErrorInternal('setUserAgreement');
  // return an observable here
})

【讨论】:

    猜你喜欢
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多