Угловые модульные тесты HttpClient не пройдут при сравнении данных внутри асинхронной функции - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь выполнить несколько простых запросов GET, и независимо от того, что я делаю, я не могу заставить тесты провалиться.

Если я поменяю ('GET') на ('POST'), то произойдет сбой, но все данные API передаются независимо от того, что.

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

import { mockPhoneNumbers } from '../mocks/data/phoneNumbers.mock';
import { PhoneNumberApiService } from './phone-number-api.service';

describe('PhoneNumberApiService', () => {
  let service: PhoneNumberApiService;
  let httpTestingController: HttpTestingController;

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

    service = TestBed.get(PhoneNumberApiService);
    httpTestingController = TestBed.get(HttpTestingController);
  });

  afterEach(() => {
    // After every test, assert that there are no more pending requests.
    httpTestingController.verify();
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

  it('should get the phone numbers successfully', () => {
    service
      .getPhoneNumbers()
      .subscribe(phoneNumbers => {
        expect(phoneNumbers).toEqual('bob');
        expect(phoneNumbers[0].id).toEqual('b8bfea4d-a26f-9e4e-cbd4-39eb69cdaa58');
        expect(phoneNumbers[1].friendlyName).toEqual('Dev Test');
      });

    const req = httpTestingController.expectOne('phoneNumbers');

    expect(req.request.method).toEqual('GET');

    req.flush(mockPhoneNumbers);
  });

  it('should get the phone number details successfully', () => {
    const { id: phoneNumberId } = mockPhoneNumbers[0];

    service
      .getPhoneNumberDetails(phoneNumberId)
      .subscribe(phoneNumber => expect(phoneNumber).toEqual(mockPhoneNumbers[0]));

    const req = httpTestingController.expectOne(`phoneNumbers/${phoneNumberId}`);

    expect(req.request.method).toEqual('GET');

    req.flush('bob');
  });
});

Обязательно сбрасывает запрос фиктивными данными, а затем ожидает, что фиктивные данные равны bob, неверно. В нижнем тесте сбрасывание запроса с помощью bob и ожидание, что данные будут равны первому номеру телефона в массиве, должны завершиться неудачей.

1 Ответ

0 голосов
/ 21 января 2019

Проблема ваших тестов заключается в том, что вы заставляете свои "it" функционировать и ожидаете асинхронности без явного указания жасмину, что.

Вам нужно использовать функцию done в другом, чтобы сообщить о том, что тест ожидает чего-то (см. здесь хорошее руководство по асинхронному тесту на жасмине)

Следует примеру на основе вашего кода:

...
//Receive the done function like this
it('should get the phone numbers successfully', (done) => {
    service
      .getPhoneNumbers()
      .subscribe(phoneNumbers => {
        expect(phoneNumbers).toEqual('bob');
        expect(phoneNumbers[0].id).toEqual('b8bfea4d-a26f-9e4e-cbd4-39eb69cdaa58');
        expect(phoneNumbers[1].friendlyName).toEqual('Dev Test');
        //Tell the test that only in here all the work was done
        done();
      });
    const req = httpTestingController.expectOne('phoneNumbers');

    expect(req.request.method).toEqual('GET');

    req.flush(mockPhoneNumbers);
});
....

Кроме того, чтобы ответить на ваше предположение , jest - это тестовый прогон, основанный на фреймворке jasmine (то есть синтаксис jest похож на jasmin, но не равен). Но для этого случая я предполагаю, что использование готового решит вашу проблему.

...