Я нашел решение.
Я выполняю каждый тест в своем собственном текстовом контексте, например (упрощенный пример):
using (var context = IntegrationTestEnvironment.Setup())
{
User bobbyUserDo = new User();
Profile bobbyPatientDo = new Patient(bobbyUserDo, "bobbyPatient@hotmail.com");
var bobbyUserDb = await context.UserRepository.AddOrUpdateAsync(bobbyUserDo);
bobbyUserDb.Should().NotBeNull();
bobbyUserDb.Id.Should().BeGreaterThan(0);
bobbyUserDb.Profiles.Should().HaveCount(1);
bobbyUserDb.Profiles.First().Id.Should().BeGreaterThan(0);
}
В моем методе установки я подготавливаю среду:
public static IntegrationTestContext Setup(bool prefillWithTestData)
{
var webHost = WebHost.CreateDefaultBuilder()
.UseStartup<Startup>()
.Build();
var serviceProvider = new DependencyResolverHelpercs(webHost);
}
Метод Startup содержит метод ConfigureServices, где я настраиваю все службы, которые мне нужны для теста:
public void ConfigureServices(IServiceCollection services)
{
// Scans assemblies and adds MediatR handlers, preprocessors, and postprocessors implementations to the container.
services.AddMediatR(typeof(Application.Logic.Queries.FindUserByEmailAddressHandler));
var localDb = new LocalDb();
services.AddSingleton<ILocalDb, LocalDb>(uow => localDb);
services.AddSingleton<IUnitOfWork, UnitOfWork>(uow => new UnitOfWork(localDb.ConnectionString));
services.AddSingleton<IUserRepository, UserRepository>();
}
В то время я создаю LocalDb (который создает локальныйбазы данных), и после этого я могу просто передать строку подключения в мою единицу работы.
Тест может быть выполнен в контексте, где у меня правильно настроено внедрение зависимостей, и он действителен в этом тесте.Вот почему я использовал Singleton: экземпляры совпадают с контекстом этого конкретного теста;и после теста все удаляется и локальная база данных удаляется.