Заменить зависимость в IO C Autofa c в интеграционных тестах - PullRequest
0 голосов
/ 22 февраля 2020

Я пишу интеграционные тесты для существующего проекта. В проекте используется Autofa c в качестве IO C. Я не могу понять, как заменить сервис, который был зарегистрирован Autofa c.

Я использую. net core 3.1 и Autofa c 4.9.4 и Autofa c .Extensions.DependencyInjection 5.0.1 Часть службы, зарегистрированная в стандарте. net core IO C, метод выглядит так

public virtual void ConfigureServices(IServiceCollection services)
{
    .....
    services.AddHangfireServer();
    services.TryAddTransient<IEfCoreEventDispatcher, EfCoreEventDispatcher>();
    .....
}

, затем регистрирует модули Autofa c в другом методе, который должен вызываться фабрикой autofa c (не уверен насчет этого утверждения)

public void ConfigureContainer(ContainerBuilder builder)
{
    ....
    builder.RegisterModule<AutofacApplicationModule>();
    builder.RegisterType<MolliePaymentClientFactory>().AsImplementedInterfaces();
    ....
}

В program.cs я указываю собственную фабрику для поставщика услуг в соответствии с документацией autofa c.

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseServiceProviderFactory(new AutofacServiceProviderFactory())
        .ConfigureWebHostDefaults(webHostBuilder => webHostBuilder
            .UseSerilog()
            .UseStartup<Startup>());

В тесте интеграции я создаю пользовательскую WebApplicationFactoty

public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class
{


    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {

        builder.ConfigureServices(services =>
        {
            services.Replace(new ServiceDescriptor(typeof(IEfCoreEventDispatcher), typeof(EfCoreEventDispatcherFake), ServiceLifetime.Transient));

            // Remove the app's AppDbContext registration.
            var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<AppDbContext>));

            if (descriptor != null)
                services.Remove(descriptor);

            // Add ApplicationDbContext using an in-memory database for testing.
            services.AddDbContext<AppDbContext>(options => options.UseInMemoryDatabase("testDb"));

            var hangfireMock = new Mock<IBackgroundJobClient>();
            services.Replace(new ServiceDescriptor(typeof(IBackgroundJobClient), hangfireMock.Object));
        });


    }
}

Я могу заменить службу, которая была зарегистрирована в Microsoft IO C, но не могу заменить службу, которая была зарегистрирована в Autofa c

Когда я пытаюсь позвонить

var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(IMolliePaymentClientFactory));

результат равен нулю, он еще не доступен на момент вызова "ConfigureServices", и я не могу найти способ сделать это ,

Кто-нибудь может помочь мне решить эту проблему?

...