Как интегрировать данные из другого сервиса в тестовую среду
Что проверяют
Умеете ли вы сделать тесты независимыми от чужого сервиса: его доступности, данных и скорости. Следом обычно спрашивают, как вы узнаете, что внешний сервис поменял контракт, если в тестах его нет.
Как отвечать
Разделите уровни, у каждого свой способ:
- юнит-тесты: внешний клиент спрятан за интерфейсом (
IOrdersClient), в тесте его подменяет Moq или NSubstitute. Если под тестом самHttpClient, подменяютHttpMessageHandler; - интеграционные тесты сервиса:
WebApplicationFactory<Program>поднимает приложение в памяти, а вConfigureTestServicesтипизированный клиент перенаправляют на заглушку. WireMock.Net запускает настоящий HTTP-сервер на случайном порту и отдаёт описанные ответы, включая задержки, 500 и обрывы; - данные в своей базе: Testcontainers for .NET поднимает PostgreSQL или SQL Server в Docker на время прогона, схема накатывается миграциями EF Core. Каждый тест готовит свои данные и не зависит от порядка;
- общий стенд: если нужны реальные данные соседа, берут его тестовый контур или обезличенную выгрузку, а не копию прода с персональными данными.
Чтобы заглушки не разошлись с реальностью, добавьте контрактные тесты на PactNet: потребитель фиксирует ожидания, провайдер проверяет их в своём CI. Ответы для WireMock удобно хранить JSON-файлами рядом с тестами.
Отдельно покройте негатив: таймаут, 429, пустой список, лишнее поле в JSON. Если стоит Polly или Microsoft.Extensions.Http.Resilience, заглушка должна уметь отдавать ошибки, иначе политики повторов никто не проверил.
Где спотыкаются
Ходят из тестов в настоящий внешний сервис. Прогон медленный, флакает от чужих выкладок и может портить чужие данные.
Создают new HttpClient() прямо в классе. Такой код не подменить без переписывания, а клиент на каждый запрос ещё и исчерпывает сокеты. Клиент получают через IHttpClientFactory.
Мокают всё и никогда не сверяют контракт. Тесты зелёные, а после переименования поля у соседей интеграция падает уже на проде.