TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #1167 1.39K
День девятьсот пятидесятый. #ЗаметкиНаПолях
Относитесь к Интеграционным Тестам Как к Внешним Потребителям
В ASP.NET Core есть отличная поддержка для написания интеграционных тестов. Они используются, например, при создании API, чтобы убедиться, что вы не нарушаете публичные контракты при разработке.

Допустим, у нас есть контроллер, выдающий информацию о гамбургере:
public class HamburgersController : ControllerBase
{
[HttpGet("{name}")]
public ActionResult<HamburgerDto> Get(string name)
{
var burger = new HamburgerDto();
// получение информации
// …
return new OkObjectResult(burger);
}
}

public class HamburgerDto
{
public string Name { get; set; }
}

Мы создаём интеграционный тест, чтобы убедиться, что конечная точка работает должным образом, например, выдаёт 200 OK. И ещё один тест, который проверяет, что тело ответа содержит название гамбургера (тестирование контракта):
public async Task ShouldReturnBurgerName()
{
// запрос к контроллеру
// …
var burger = await JsonSerializer
.DeserializeAsync<HamburgerDto>(
response,
new JsonSerializerOptions(JsonSerializerDefaults.Web));

burger.Name.ShouldBe("Big Mac");
}

Тест работает отлично, но у него есть одна серьезная проблема. Выше мы говорили, что этот тест предназначен, чтобы проверить, не нарушаем ли мы контракт. Представьте, что нам нужно переименовать свойство Name в HamburgerName (критическое изменение в контракте). Если мы используем инструмент рефакторинга, который автоматически переименует свойство во всех местах, где оно используется, вышеуказанный тест обновится автоматически и все равно будет проходить:
…
burger.HamburgerName.ShouldBe("Big Mac");
…
Проблема в том, что мы десериализуем ответ в класс HamburgerDto. Мы привязываем наш интеграционный тест к деталям реализации нашего API.

Вместо десериализации ответа в HamburgerDto мы можем использовать JsonDocument:
public async Task ShouldReturnBurgerName()
{
// запрос к контроллеру
// …
var burger = await
JsonDocument.ParseAsync(response);

burger.RootElement
.GetProperty("name").GetString()
.ShouldBe("Big Mac");
}

Теперь, если бы мы изменили свойство Name на HamburgerName, вышеуказанный тест не прошёл бы. Это делает тест более похожим на внешнего потребителя нашего API. Используя такой подход, мы можем предотвратить внесение критических изменений в производственный код.

Источник: https://josef.codes/treat-you-integration-tests-as-external-consumers/
More from @netdeveloperdiary
  1. Oct 16, 2026День 2816. #Карьера #AI Станет ли ИИ-Кодинг Концом Программирования для Людей? Автор ориги…
  2. Oct 15, 2026Post #3374
  3. Oct 14, 2026Post #3373
  4. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  5. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  6. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →