Я хочу настроить свои тесты с помощью WebApplicationFactory<T>
, как подробно описано в
Интеграционные тесты в ASP.NET Core.
Перед некоторыми из моих тестов мне нужно использовать службу, настроенную в реальном классе Startup, чтобы настроить вещи. У меня проблема в том, что я не вижу способа получить обслуживание на заводе.
Я мог бы получить услугу от factory.Server
, используя factory.Host.Services.GetRequiredService<ITheType>();
, за исключением того, что factory.Server
имеет значение null, пока не будет вызван factory.CreateClient();
.
Есть ли какой-нибудь способ получить услугу с помощью фабрики?
Спасибо.
Или вы можете настроить заводскую docs.microsoft.com/en-gb/aspnet/core/test/…
Спасибо @Nkosi. Мне нужно получить службу, зарегистрированную в реальном запуске, а не в тестовом запуске. Я хочу запустить тест с использованием полностью настроенного приложения, поэтому мне нужно получить реальный сервис, вызвать несколько методов для настройки некоторых данных, а затем запустить мой тестовый сценарий. Мне нужно иметь возможность получать эту услугу в каждом тесте.
создать тестовый стартап, унаследованный от реального стартапа. переопределить configureservices, вызвать базу, построить поставщик, получить услугу и выполнить настройку
Если я смогу увидеть какой-то код, я, вероятно, смог бы дать более подробное объяснение.
Хорошо, большое спасибо @Nkosi, я создам минимальный пример.
Спасибо за ваше предложение @Nkosi. Приносим извинения за то, что не получили вам пример.
Не стоит беспокоиться. Рад видеть, что у вас есть решение.
Вам необходимо создать сфера от поставщика услуг, чтобы получить необходимую услугу:
using (var scope = AppFactory.Server.Host.Services.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<MyDatabaseContext>();
}
если factory.Server
- это null
, сначала подумайте о том, чтобы вызвать в factory.CreateClient()
!
Прошу простить меня. Я знаю, что вы просите 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();
}
Разве стартап, использованный для тестирования, не сможет зарегистрироваться и использовать сервис? Покажи, что у тебя уже есть в том, что ты пытаешься сделать