Различный порядок вызовов ConfigureServices между. NET Core 2.1 и 3.1 в WebApplicationFactory - PullRequest
0 голосов
/ 19 марта 2020

Во время миграции с. 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, который заменяет услугу. Это ошибка или желаемое изменение? Можно ли это как-то побороть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...