Я настраиваю некоторые интеграционные тесты для обработчиков mediatr, используя xunit, respawn и webapplicationfactory....
Один из классов, в конечном итоге вызываемый тестируемым обработчиком mediatr.. имеет зависимость от IHttpContextAccessor, как вы можете видеть ниже.
Я чувствую, что настроил "замещающий" синглтон, который я хочу правильно ввести, как показано ниже:
Но когда запускается интеграционный тест... httpContextAccessor не является нулевым, но HttpContext ВСЕГДА имеет значение null.
Я перепробовал около 6 миллионов вещей :( Много грусти.
Как заставить IHttpContextAccessor правильно разрешить то, что я устанавливаю в ConfigureServices?





Когда выполняется тест интеграции. httpContextAccessor не является нулевым, но HttpContext ВСЕГДА имеет значение null. Как заставить IHttpContextAccessor правильно разрешить то, что я настройка в ConfigureServices?
Нет, мы не можем, HttpContext будет доступен только в рамках запроса, потому что ConfigureServices вызывается перед созданием Startup, поэтому, если мы попытаемся внедрить, это произойдет через исключение, даже если мы объявим глобальную переменную в этом сценарии, она всегда будет нулевой. Запуск приложения происходит только один раз и задолго до того, как будет получен какой-либо запрос.
Давайте попробуем получить к нему доступ в IConfiguration следующим образом:
public Startup(IConfiguration configuration,IHttpContextAccessor httpContextAccessor)
{
Configuration = configuration;
HttpContextAccessor = httpContextAccessor;
}
public IConfiguration Configuration { get; }
public IHttpContextAccessor HttpContextAccessor { get; }
Выход:
Как видите, это не позволяет нам этого сделать.
Даже если мы попытаемся ввести его в самой конфигурации, это приведет к следующему исключению:
Таким образом, ConfigureServices запускается один раз перед тем, как какой-либо http-запрос поступает в приложение. Если мы принудительно попытаемся вызвать его за пределами жизненного цикла запроса, это всегда закончится NullReferenceException. Вы можете получить более подробную информацию в официальном документе.
В дополнение к этому мы можем внедрить ссылку на службу в конфигурацию следующим образом:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Обычно они создают собственный ControllerContext для тестов, которые могут содержать контекст HTTP. Обратите внимание, что он использует HttpContextBase, который вы можете наследовать и даже имитировать полностью настраиваемый контекст HTTP в своем тесте. Я бы порекомендовал вам проверить этот официальный документ. К тому же, честно говоря, я начинающий разработчик с минимумом опыта в тестировании. Спасибо за ваш ответ. Документ может быть полезен.
Мне нужно было реализовать IHttpContextAccessor самостоятельно
Затем используйте в ConfigureTestServices WebApplicationFactory ConfigureWebHost.
спасибо за ответ... так что же делать мужчине? Настроить интеграционные тесты, чтобы они поступали через httpClient в мою фабрику веб-приложений и иметь фактический httpcontext?