Как заменить реализации службы для тестирования интеграции веб-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

Другие вопросы по тегам