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 | |