Во время миграции с. NET Core 2 на 3, я заметил резкое изменение WebApplicationFactory
. Repro: https://github.com/lukasz-pyrzyk/orderofconfigureservices
В моей базовой библиотеке для тестирования интеграции я использовал WebApplicationFactory
для настройки сервера и настройки служб. Например, представьте следующие сервисы
public interface IHelloService
{
string Say();
}
public class HelloService : IHelloService
{
public string Say() => "Hello from original service";
}
public class CustomHelloService : IHelloService
{
public string Say() => "Hello from custom service";
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHelloService, HelloService>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
}
}
Базовый класс для интеграционных тестов, и прибор выглядит следующим образом:
public class TestFixture : IntegrationTests<Startup>
{
[Fact]
public void SayHallo()
{
var service = Services.GetService<IHelloService>();
Assert.Equal("Hello from custom service", service.Say());
}
protected override void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHelloService, CustomHelloService>();
}
}
public abstract class IntegrationTests<TStartup> : IDisposable where TStartup : class
{
private readonly WebApplicationFactory<TStartup> _factory;
protected IntegrationTests() : this(typeof(TStartup).Assembly.GetName().Name)
{
}
protected IntegrationTests(string projectRelativePath)
{
_factory = new WebApplicationFactory<TStartup>().WithWebHostBuilder(b =>
{
b
.UseSolutionRelativeContentRoot(Path.Combine("src", projectRelativePath))
.ConfigureServices(ConfigureServices);
});
_factory.CreateClient();
Services = _factory.Services;
}
protected IServiceProvider Services { get; }
protected virtual void ConfigureServices(IServiceCollection services)
{
}
public void Dispose()
{
_factory.Dispose();
}
}
On .NET Core 2.1
и Microsoft.AspNetCore.Mvc.Testing 2.1.3
вызывается метод TestFixture.ConfigureServices()
до Startup.ConfigureServices
и тестовых прохождений .
При .NET Core 3.1
и Microsoft.AspNetCore.Mvc.Testing 3.1.1
метод TestFixture.ConfigureServices()
вызывается после Startup.ConfigureServices
и тест не пройден .
Знаете ли вы, было ли это изменение преднамеренным? В. NET Core 2.1 сначала вызывался ConfigureServices из теста, а TryAddSingleton
регистрировал мой фиктивный сервис. Позже Startup.ConfigureServices
пропустил регистрацию, потому что услуга уже была добавлена.
С. NET Core 3.1 Я вынужден позвонить AddSingleton
, который заменяет услугу. Это ошибка или желаемое изменение? Можно ли это как-то побороть?