У меня есть пользовательский WebApplicationFactory<Startup>
, для которого я смоделировал некоторые службы для интеграционного тестирования, например DatabaseSeeder
, чтобы тесты выполнялись быстрее.
Теперь я хочу протестировать заполнение базы данных, поэтомуЯ хочу переопределить конфигурацию, чтобы использовать настоящий тестер базы данных в этом тесте.
Я пытался использовать WithWebHostBuilder
, он возвращает новый WebApplicationFactory<Startup>
, но метод builder.ConfigureTestServices
в этом новом заводском запуске выполняется до исходного, так чтоон переопределяется оригинальной фабрикой ConfigureTestServices
/// <summary>
/// custom web application factory for testing.
/// </summary>
public class LwtTestWebApplicationFactory : WebApplicationFactory<Startup>
{
....
/// <inheritdoc />
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureTestServices(
services =>
{
// Replace database seeder.
ServiceDescriptor databaseSeederDescriptor =
services.Single(s => s.ServiceType == typeof(IDatabaseSeeder));
services.Remove(databaseSeederDescriptor);
var mock = new Mock<IDatabaseSeeder>();
mock.Setup(s => s.SeedData())
.Returns(Task.CompletedTask);
services.AddTransient(resolver => mock.Object);
// Replace index creator.
ServiceDescriptor indexCreatorDescriptor =
services.Single(s => s.ServiceType == typeof(IIndexCreator));
services.Remove(indexCreatorDescriptor);
var indexCreatorMock = new Mock<IIndexCreator>();
indexCreatorMock.Setup(s => s.CreateIndexesAsync())
.Returns(Task.CompletedTask);
services.AddTransient(resolver => indexCreatorMock.Object);
// Remove the app's ApplicationDbContext registration.
ServiceDescriptor descriptor = services.SingleOrDefault(
d => d.ServiceType == typeof(DbContextOptions<IdentityDbContext>));
if (descriptor != null)
{
services.Remove(descriptor);
}
// Add ApplicationDbContext using an in-memory database for testing.
services.AddDbContext<IdentityDbContext>(
(options, context) => { context.UseInMemoryDatabase("InMemoryDbForTesting"); });
ServiceDescriptor appSettingDescriptor = services.SingleOrDefault(
d => d.ServiceType == typeof(AppSettings));
if (appSettingDescriptor != null)
{
var appSetting = (AppSettings)appSettingDescriptor.ImplementationInstance;
services.Remove(appSettingDescriptor);
services.AddSingleton(
new AppSettings
{
MongoDatabase = appSetting.MongoDatabase,
Secret = appSetting.Secret,
MongoConnectionString = this.mongoDbRunner.ConnectionString,
});
}
});
}
.....
}
}
Что я пробовал.
using (var factory = new LwtTestWebApplicationFactory())
using (WebApplicationFactory<Startup> seedEnabledFactory = factory.WithWebHostBuilder(
builder =>
{
builder.ConfigureTestServices(
services =>
{
// Replace database seeder.
ServiceDescriptor databaseSeederDescriptor =
services.Single(s => s.ServiceType == typeof(IDatabaseSeeder));
services.Remove(databaseSeederDescriptor);
services.AddTransient<IDatabaseSeeder, DatabaseSeeder>();
// Replace index creator.
ServiceDescriptor indexCreatorDescriptor =
services.Single(s => s.ServiceType == typeof(IIndexCreator));
services.Remove(indexCreatorDescriptor);
services.AddTransient<IIndexCreator, MongoDbIndexCreator>();
});
}))