Получение службы из WebApplicationFactory <T> в интеграционных тестах ASP.NET Core

Я хочу настроить свои тесты с помощью WebApplicationFactory<T>, как подробно описано в Интеграционные тесты в ASP.NET Core.

Перед некоторыми из моих тестов мне нужно использовать службу, настроенную в реальном классе Startup, чтобы настроить вещи. У меня проблема в том, что я не вижу способа получить обслуживание на заводе.

Я мог бы получить услугу от factory.Server, используя factory.Host.Services.GetRequiredService<ITheType>();, за исключением того, что factory.Server имеет значение null, пока не будет вызван factory.CreateClient();.

Есть ли какой-нибудь способ получить услугу с помощью фабрики?

Спасибо.

Разве стартап, использованный для тестирования, не сможет зарегистрироваться и использовать сервис? Покажи, что у тебя уже есть в том, что ты пытаешься сделать

Nkosi 10.10.2018 19:09

Или вы можете настроить заводскую docs.microsoft.com/en-gb/aspnet/core/test/…

Nkosi 10.10.2018 19:10

Спасибо @Nkosi. Мне нужно получить службу, зарегистрированную в реальном запуске, а не в тестовом запуске. Я хочу запустить тест с использованием полностью настроенного приложения, поэтому мне нужно получить реальный сервис, вызвать несколько методов для настройки некоторых данных, а затем запустить мой тестовый сценарий. Мне нужно иметь возможность получать эту услугу в каждом тесте.

Simon Vane 10.10.2018 19:14

создать тестовый стартап, унаследованный от реального стартапа. переопределить configureservices, вызвать базу, построить поставщик, получить услугу и выполнить настройку

Nkosi 10.10.2018 19:17

Если я смогу увидеть какой-то код, я, вероятно, смог бы дать более подробное объяснение.

Nkosi 10.10.2018 19:17

Хорошо, большое спасибо @Nkosi, я создам минимальный пример.

Simon Vane 10.10.2018 20:20

Спасибо за ваше предложение @Nkosi. Приносим извинения за то, что не получили вам пример.

Simon Vane 18.01.2019 13:41

Не стоит беспокоиться. Рад видеть, что у вас есть решение.

Nkosi 18.01.2019 13:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
29
8
7 298
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам необходимо создать сфера от поставщика услуг, чтобы получить необходимую услугу:

using (var scope = AppFactory.Server.Host.Services.CreateScope())
{
    var context = scope.ServiceProvider.GetRequiredService<MyDatabaseContext>();
}

если factory.Server - это null, сначала подумайте о том, чтобы вызвать в factory.CreateClient()!

Majid 15.05.2019 15:28

Прошу простить меня. Я знаю, что вы просите Net Core 2.1, но так как v3.1 + люди тоже пришли сюда ...

В моем проекте используется Net Core 3.1. Когда я использую AppFactory.Server.Host.Services.CreateScope(), как предложение Алексея Старчикова, я сталкиваюсь с этой ошибкой.

The TestServer constructor was not called with a IWebHostBuilder so IWebHost is not available.

Отметил здесь, по дизайну.

Поэтому я использую следующий подход. Я поместил заполнение базы данных в конструктор тестового класса. Обратите внимание, мне не нужно звонить в factory.CreateClient(). Как обычно, я создаю клиентские переменные в тестовых методах.

using (var scope = this.factory.Services.CreateScope())
{
    var dbContext = scope.ServiceProvider.GetRequiredService<YourDbContext>();

    // Seeding ...

    dbContext.SaveChanges();
}

Другие вопросы по теме