Я столкнулся с проблемой, когда я использую пользовательский WebApplicationFactory , и он не регистрирует службы в моем файле Startup.cs. Я использую Asp. Net core 3.1 и Xunit.
У меня ниже в моем API (startup.cs) зарегистрировано с использованием методов расширения:
public void ConfigureServices(IServiceCollection services)
{
services.AddBaseApiConfiguration(Configuration);
services.AddRepositoryServices();
services.AddApiServices();
services.AddMediatrServices();
}
Для документации MS:
Зарегистрирован контекст базы данных SUT в его метод Startup.ConfigureServices. Обратный вызов builder.ConfigureServices тестового приложения выполняется после выполнения кода приложения Startup.ConfigureServices.
Но выше не происходит. Ни одна из моих служб из запуска, которую я использую, не регистрируется ( т.е. 4 метода расширения, которые у меня есть, никогда не вызываются и никогда не регистрируются) . Это вызывает несколько проблем: мой контекст БД использует IMediatr в своем конструкторе, так что события могут публиковаться во время context.SaveChangesAsyn c () (в случае успеха). Но так как мой сервис никогда не регистрируется, он не может его найти. Как мне убедиться, что это происходит правильно?
Ниже моя фабрика:
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder
.UseEnvironment("Development")
.ConfigureServices(services =>
{
// Remove the app's db context registrations
var descriptor = services.SingleOrDefault(
d => d.ServiceType ==
typeof(DbContextOptions<AppDbContext>));
if (descriptor != null)
{
services.Remove(descriptor );
}
services.AddSingleton<IDbConnectionFactoryService, SqliteConnectionFactoryService>();
// Add a database context using an in-memory
// database for testing.
services.AddDbContext<AppDbContext>(options =>
{
options.UseSqlite("Data Source=sqlitedemo.db");
});
// Build the service provider.
var sp = services.BuildServiceProvider();
// Create a scope to obtain a reference to the database context
using (var scope = sp.CreateScope())
{
var scopedServices = scope.ServiceProvider;
var db = scopedServices.GetRequiredService<AppDbContext>();
// Ensure the database is created.
db .Database.EnsureDeleted();
db .Database.EnsureCreated();
}
});
}
Редактировать: Кажется, что службы в Startup.cs
вызываются после службы фабрики CustomWebApplication. Это совершенно странно для Net core 3.0, порядок был изменен на противоположный. Так почему же это все еще происходит?
Редактировать 2 : необходимо использовать ConfigureTestServices вместо ConfigureServices.