Что первое, что приходит вам в голову, когда вы понимаете, что ваш модульный тест должен имитировать HttpContext? 😭 Это не сложная задача, но, согласитесь, скучная.

Я часто задавался вопросом, могу ли я найти лучший способ быстрее писать модульные тесты, чтобы уменьшить сопротивление написанию и даже улучшить их качество. Итак, я приступил к делу и написал реализацию HttContext Mock, которая инициализирует из коробки все свойства и методы без какой-либо настройки.

HttpContextMoq

Мое предложение - это пакет HttpContextMoq, доступный на nuget.org, и исходный код на GitHub.

Например, если вам нужно имитировать заголовок Referer в вашем запросе, вам нужно написать 5 строк кода, 6, если вы рассматриваете создание Mock<HttpContext>.

С HttpContextMock вам нужна только одна строка для настройки заголовка referer.

Что такое класс HttpContextMock?

HttpContextMock - это реализация AspNetCore.Http.HttpContext, которая хранит Mock<HttpContext> экземпляр и работает как прокси для настоящего Mock.

Конструктор HttpContextMock инициализирует макет для запроса, ответа, заголовка и т. Д., Чтобы он также работал в качестве прокси.

Например, HttpRequest следует тому же шаблону и так один, и так один, до последнего чистого метода и свойств вашего контекста запроса.

Итак, когда вы создаете экземпляр HttpContextMock, все настройки доступны и инициализированы.

Как использовать HttpContextMoq?

Импортируйте пакет Nuget HttpContextMoq:

Или, если вы хотите настроить реализацию, вы можете клонировать или / и скопировать код в свой проект. Смотрите исходный код здесь:

Расширения HttpContextMock

HttpContextMock имеет 5 расширений для большинства случаев использования модульного тестирования ASP.NET Core:

  • Запросить URL HttpContextMock.SetupUrl()
  • Заголовки запросов HttpContextMock.SetupRequestHeaders()
  • Запросить файлы cookie HttpContextMock.SetupRequestCookies()
  • Сессия HttpContextMock.SetupSession()
  • Запросить услуги HttpContextMock.SetupRequestService()

На изображении ниже мы видим очень полезный макет URL https://localhost/mocks?assert=true, который будет настраивать все запросы и свойства и методы запросов.

Смотрите SetupUrl исходный код здесь.

Session, как и URL, задает свойства Session и Features для HttpContext. См. Пример модульного теста ниже.

Расширения Request.Headers, Request.Cookies и RequestServices также пытаются изменить эти свойства с минимальными усилиями.

Случаи применения

Я рекомендую просмотреть образцы кода и некоторые модульные тесты, чтобы проверить, как вы можете настроить свой HttpContext по URL-адресу, сеансу, заголовкам, файлам cookie, запросам и т. Д.

Заключение

Возможно, это не лучшее решение для вас, а может, и не для всех, но в моем случае это сэкономило мне много времени на тысячи модульных тестов, которые я написал с помощью HttpContext.

Если у вас есть предложения, улучшения или что-то еще, откройте вопрос на Github или оставьте комментарий. Я буду счастлив узнать, что это может помочь большему количеству людей.

Тесты безопасны.