Как заменить реализации службы для тестирования интеграции веб-API с помощью TestHost.TestServer в .NET 5
Я пытаюсь перенести свои интеграционные тесты из
WebApplicationFactory
в .NET 5. В моей существующей реализации я могу переопределить
ConfigureWebHost
и позвони
IWebHostBuilder.ConfigureServices
заменить реализации сервисов на моки. Это выполняется после кода, что позволяет мне удалить производственную реализацию и добавить макет.
При попытке добиться того же, используя
TestServer
,
ConfigureServices
всегда работает до тогоStartup
кода, независимо от того, в каком порядке я выполняю настройку, то есть я всегда получаю обе реализации в коллекции служб, и кажется, что «побеждает последняя», то есть всегда запускается prod-версия службы.
Как я могу настроить построитель для использования моей тестовой версии?
Я использую XUnit, поэтому, возможно, я использую его неправильно.
IClassFixture
и т.п.
Вот мой код:
public sealed class IntegrationTests : IDisposable
{
private TestServer Server { get; }
private HttpClient Client { get; }
public IntegrationTests()
{
var builder = new WebHostBuilder()
.UseConfiguration(new ConfigurationBuilder().AddJsonFile("appsettings.development.json").Build())
.UseSerilog()
// Changing the order of the following two lines doesn't help
.UseStartup<Startup>()
.ConfigureServices(UseDummyUserRepository);
Server = new TestServer(builder);
Client = Server.CreateClient();
}
private void UseDummyUserRepository(IServiceCollection services)
{
//Following line doesn't work as the service is not yet configured
//services.Remove(services.First(s => s.ServiceType == typeof(IUserRepository)));
services.AddTransient<IUserRepository, DummyUserRepository>();
}
2 ответа
Я узнал о существовании TryAddTransient, который выполняет свою работу, но выглядит как взлом.
Этот пост содержит дополнительную информацию, которая может оказаться полезной.
Из моего тестирования порядок выполнения в интеграционном тесте выглядит следующим образом.
Startup.ConfigureServices
IWebHostBuilder.ConfigureServices
IWebHostBuilder.ConfigureTestServices
Startup.ConfigureContainer
Таким образом, проблема возникает, когда вы пытаетесь переопределить службу в IWebHostBuilder.ConfigureServices, если эта служба фактически определена в Startup.ConfigureContainer.
Я попытался использовать IWebHostBuilder.ConfigureTestContainer, но он не был выполнен .
Как переопределить регистрацию DI из другого контейнера в интеграционном тесте ASP.NET Core