Как написать модульный тест для http с httpheaders в Angular 2 Карма Жасмин? - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь сделать несколько тестов для моего сервиса. В основном это Rest-звонки. Но некоторые из моих 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 , Я не добавляю это, потому что я не знаю, как включить их в тест.

Кто-нибудь знает, как я могу выполнить этот тест?

РЕДАКТИРОВАТЬ:

Или может Я делаю что-то подобное? (node ​​- это массив узлов, который заполняется при вызове 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 () должен возвращать несколько попаданий.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Единственная "проблема", которую я вижу, состоит в том, что более рекомендуется использовать rx js `pipe 'как:

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

: p

0 голосов
/ 26 февраля 2020

Использовать шпион для фальшивых звонков. также импорт оператора.

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);
});
...