Угловые модульные тесты HttpClient не пройдут при сравнении данных внутри асинхронной функции
Я пытаюсь выполнить несколько простых запросов 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 ответ
Проблема ваших тестов заключается в том, что вы заставляете свои "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, но не равен). Но для этого случая я предполагаю, что использование готового решит вашу проблему.