簡體   English   中英

如何在 Angular 2 Karma Jasmine 中使用 httpheaders 為 http 編寫單元測試?

[英]How to write unit test for http with httpheaders in Angular 2 Karma Jasmine?

我嘗試對我的服務進行一些測試。 其中主要是休息電話。 但是我的一些 Rest 調用有 HttpHeaders。 如何進行包含標頭參數的測試?

我想對此進行測試:

public getAllNodes(): Observable<any> {
    let headers: HttpHeaders = new HttpHeaders();
    headers = headers.append('Content-Type', 'application/json');
    headers = headers.append('Authorization', 'someTokenABC');
    headers = headers.append('subscriptionId', 'aaa111');
    headers = headers.append('organizationId', 'bbb222');
    return this.http.get('https://someUrl/getall', {headers: headers, observe: 'response'})
      .map(response => {
        return response;
      })
      .catch(this.handleError);
  }

到目前為止,這是我的測試:

describe('#getAllNodes', () => {
  let injector: TestBed;
  let service: MyService;
  let httpMock: HttpTestingController;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [MyService]
    });
    injector = getTestBed();
    service = injector.get(MyService);
    httpMock = injector.get(HttpTestingController);
  });

  it('should return an Observable<any>', () => {
    var dummyNodes = [{
          "contentId": "111-222-333",
          "title": "some title",
          }];

    service.getAllNodes().subscribe(nodes => {
      expect(nodes.length).toBe(1);
      expect(nodes).toEqual(dummyNodes);
   });

   const req = httpMock.expectOne('https://someUrl/getall');
   expect(req.request.method).toBe("GET");
   req.flush(dummyNodes);
   httpMock.verify();
});
});

在我的情況下,我收到此錯誤:預期有一個對條件“匹配 URL: https://someUrl/getall ”的匹配請求,沒有找到。

但我想這與httpheader有關。 我沒有添加這個,因為我不知道如何將它們包含在測試中。

有誰知道我如何解決這個測試?

編輯:

或者我可以做這樣的事情嗎? (nodes 是一個節點數組,在調用 getAllNodes() 時被填滿)

describe('#getAllNodes', () => {
  let injector: TestBed;
  let service: MyService;

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

    injector = getTestBed();
    service = injector.get(MyService);
  });

  it('should have no nodes at startup', () => {
    expect(service.nodes.length).toBe(0);
  })

  it('should have more than 1 node', () => {
    service.getAllNodes();
    expect(service.nodes.length).toBeGreaterThan(0);
  })

});

但是在最后一次測試中,它返回 0 個命中。 即使 service.getAllNodes() 應該返回多個命中。

使用 spyon 進行虛假服務呼叫。 也進口運營商。

import { of } from 'rxjs';



describe('#getAllNodes', () => {
it('should return an Observable<any>', () => {
  const dummyNodes = [{
        "contentId": "111-222-333",
        "title": "some title",
        }];
  spyOn(httpMock, 'get').and.returnValue(of(dummyNodes));
  service.getAllNodes().subscribe(nodes => {
    expect(nodes.length).toBe(1);
    expect(nodes).toEqual(dummyNodes);
 });

 expect(httpMock.get).toHaveBeenCalledWith(url, paramsObj);
});

我看到的唯一“問題”是更推薦使用 rxjs `pipe' 作為:

    return this.http.get('https://someUrl/getall', { headers: headers, observe: 'response' }).pipe(
      map((response: any) => {
        return response;
      }),
    );

:p

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM