HTTP-клиент — Тестовые запросы¶
14.11.2022
Как и для любой другой внешней зависимости, вы должны подражать HTTP-бэкенду, чтобы ваши тесты могли имитировать взаимодействие с удаленным сервером. Библиотека @angular/common/http/testing
позволяет легко настроить такое моделирование.
Библиотека HTTP-тестирования¶
Библиотека тестирования HTTP в Angular предназначена для модели тестирования, при которой приложение сначала выполняет код и делает запросы. Затем тест ожидает, что определенные запросы были или не были сделаны, выполняет утверждения против этих запросов и, наконец, предоставляет ответы путем "промывки" каждого ожидаемого запроса.
В конце тесты могут проверить, что приложение не делало неожиданных запросов.
Вы можете запустить эти примеры тестов в живой среде кодирования.
Тесты, описанные в этом руководстве, находятся в src/testing/http-client.spec.ts
. Также в src/app/heroes/heroes.service.spec.ts
находятся тесты сервиса данных приложения, которые вызывают HttpClient
.
Настройка для тестирования¶
Чтобы начать тестирование вызовов HttpClient
, импортируйте HttpClientTestingModule
и мокинг-контроллер HttpTestingController
, а также другие символы, необходимые вашим тестам.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Затем добавьте HttpClientTestingModule
в TestBed
и продолжите настройку тестируемого сервиса.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Теперь запросы, сделанные в ходе тестирования, попадают на тестирующий бэкенд вместо обычного бэкенда.
Эта установка также вызывает TestBed.inject()
для инъекции сервиса HttpClient
и контроллера мокинга, чтобы на них можно было ссылаться во время тестирования.
Ожидать и отвечать на запросы¶
Теперь вы можете написать тест, который ожидает появления GET-запроса и предоставляет имитационный ответ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Последний шаг, проверяющий, что ни один запрос не остался невыполненным, является достаточно распространенным, чтобы перенести его в шаг afterEach()
:
1 2 3 4 |
|
Ожидания пользовательских запросов¶
Если сопоставление по URL недостаточно, можно реализовать собственную функцию сопоставления. Например, вы можете искать исходящий запрос с заголовком авторизации:
1 2 3 4 |
|
Как и в предыдущем expectOne()
, тест завершается неудачно, если 0 или 2+ запросов удовлетворяют этому предикату.
Обработка более чем одного запроса¶
Если вам нужно ответить на дублирующиеся запросы в вашем тесте, используйте API match()
вместо expectOne()
. Он принимает те же аргументы, но возвращает массив совпадающих запросов.
После возврата эти запросы удаляются из будущего поиска, и вы несете ответственность за их очистку и проверку.
1 2 3 4 5 6 7 8 |
|
Тест на ошибки¶
Вы должны проверить защиту приложения от неудачных HTTP-запросов.
Вызовите request.flush()
с сообщением об ошибке, как показано в следующем примере.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
В качестве альтернативы, вызовите request.error()
с ProgressEvent
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|