Вы очень близки. Теперь ваш тест структурирован правильно, но вам нужны некоторые утилиты тестирования, предоставляемые Angular, чтобы убедиться, что ваши обещания выполняются в правильном порядке, чтобы ваши ожидания были правильными.
В конечном итоге проблема связана с Angular зоны. Потому что вы структурируете обещания в своей службе, и разрешение этого обещания должно произойти до того, как произойдет исходящий запрос. Вы вызываете loadUserData
в своем тесте, а затем в следующей строке вы пишете утверждение, в котором говорится: «Убедитесь, что этот запрос произошел, если это не ошибка». Когда вы пишете функцию получения заголовка таким образом, чтобы не использовать примитив asyn c (например, Promise
или Observable
), этот запрос выполняется «немедленно». Но когда вы используете Promise
, никакой запрос не происходит «сразу». Вместо этого он должен сначала разрешить вашу функцию извлечения заголовка.
К счастью, ваш тестовый сбой - всего лишь фантомная функция тестовой среды, а не ошибка в вашей реализации. Как я уже сказал, Angular дает вам некоторые инструменты для тестирования, чтобы убедиться, что вы можете «проверить sh» все ожидающие обещания перед написанием утверждения.
import { fakeAsync, tick } from '@angular/core/testing';
// instead of using `done`, which is just fine btw, we wrap our test function
// in fakeAsync(). This let's us have fine grained control over stepping through
// our code under test
it('should return user data on success', fakeAsync(() => {
const mockUserData : UserData = {
name: 'John',
surname: 'Do',
id: '12345'
};
(service as any).loadUserData().then(() => {
expect((service as any).userData).toEqual(mockUserData);
//expect(req.request.method).toEqual('GET');
});
// tick() steps through the next round of pending asynchronous activity
// this will also step through 'setTimeout' and 'setInterval' code
// you may have in your service, as well as Observable code
tick();
const req = httpTestingController.expectOne(
'https://testing-qh48mg.stackblitz.io/12345',
);
req.flush(mockUserData);
}));
Обновлено Stackblitz . Документы на fakeAsync
. Связанный вопрос по тестированию Http-кода в Angular с использованием tick
.