【问题标题】:catch of http request not getting called with jasmine没有被茉莉花调用的http请求的捕获
【发布时间】:2017-08-03 15:12:14
【问题描述】:

我在测试http 请求时很难调用catch 方法,但我不知道自己做错了什么。我已经将我的测试与此处找到的 lthers 进行了比较,但我无法找到我所缺少的。

这就是我要测试的方法:

public get(apiName, methodName) {
  return this.http.get(this.url + apiName + "/" + methodName, {
    headers: headers,
    search: params
  }).catch((error) => {
    this.backendErrorService.notify(this.handleError(error));

    return Observable.throw(error);
  });
}

如果我运行测试,上面的方法会被调用,我什至可以检查this.http.get是否被调用,但我不能让catch被调用。

这是我的测试:

it("should show modal when contract service throws", fakeAsync(() => {
  // Arrange
  let http = TestBed.get(Http);
  let backendService = TestBed.get(BackendErrorService);
  let backend = TestBed.get(MockBackend);

  backend.connections.subscribe((connection: MockConnection) => {
    connection.mockError(new MockError(new ResponseOptions({ type: ResponseType.Error, status: 404, body: {} })));
  });

  let httpClientService: HttpClientService = new HttpClientService(http, backendService);

  httpClientService.get("ContractApi", "GetContracts");

  // Act
  fixture.detectChanges();

  tick();

  // Assert
  console.log(fixture.debugElement);
}));

我错过了什么?

【问题讨论】:

  • 如果不进一步了解您要实现的目标,我不确定,但我发现提供 jasmine 间谍对象或 spyOn(service.http, 'get') 而不是真正的 http 服务要简单得多。这将允许您执行 mockHttp.get.and.returnValue(Observable.throw(error)) 之类的操作。
  • 很高兴您找到了问题的答案,请将其发布为答案而不是编辑see this for why :)

标签: angular jasmine rxjs


【解决方案1】:

解决方案是添加订阅。

由于它是一个Observable,如果没有订阅者,则不会进行调用,这里是完整的解决方案:

it("should show modal when contract service throws", fakeAsync(() => {
    // Arrange
    let http = TestBed.get(Http);
    let backendService = TestBed.get(BackendErrorService);
    let backend = TestBed.get(MockBackend);

    backend.connections.subscribe((connection: MockConnection) => {
      connection.mockError(new MockError(new ResponseOptions({ type: ResponseType.Error, status: 404, body: {} })));
    });

    let httpClientService = new HttpClientService(http, backendService);

    httpClientService.get("ContractApi", "GetContracts").map((res: Response) => {}).subscribe((contracts) => {
    });

    // Act
    fixture.detectChanges();

    tick();

    // Assert
    console.log(fixture.debugElement);
}));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多