如何在使用WebApplicationFactory时使用Autofac容器重载服务

7
我正在使用WebApplicationFactory编写一些集成测试。我使用Autofac作为我的依赖解析器。在我的测试中,我尝试覆盖其中一个注册以便可以模拟其中一个依赖项。使用aspnetcore默认的ConfigureServices方法很简单:
public static RestClient GetClient(Func<IDependency> dependencyFactory)
{
   var application = new WebApplicationFactory<Program>().WithWebHostBuilder(builder =>
   {
       builder.ConfigureServices(s =>
       {
            s.AddTransient<Func<IDependency>>(s=>dependencyFactory);
       });
    });
    return GetRestClient(application.CreateClient());
}

但是,我想做的是使用Autofac ContainerBuilder 来完成同样的事情。代码可能类似于:

public static RestClient GetClient(Func<IDependency> dependencyFactory)
{
   var application = new WebApplicationFactory<Program>().WithWebHostBuilder(builder =>
   {
       builder.ConfigureContainer<ContainerBuilder>(containerBuilder =>
       {
            containerBuilder.Register<IDependency>(c=>dependencyFactory()).InstancePerDependency();
       });
    });
    return GetRestClient(application.CreateClient());
}

你们中有人知道我该如何做到这一点吗?

谢谢。


2
这个 GitHub issue 的内容可能有帮助。同时请注意,只有在使用 UseServiceProviderFactory(new AutofacServiceProviderFactory()) 后才会调用 ConfigureContainer 方法。 - Travis Illig
1
谢谢。这里是解决方案。 - mberube.Net
1个回答

1

我曾经遇到过同样的问题,但是我找到了文章

简而言之

你需要从WebApplicationFactory<T>继承并重写CreateHost方法。

所以对我来说看起来像是这样的:

public class MyWebApplicationFactory: WebApplicationFactory<Program>
{
    protected override IHost CreateHost(IHostBuilder builder)
    {
        builder.ConfigureContainer<ContainerBuilder>(ConfiguresContainer);
        return base.CreateHost(builder);
    }

    private void ConfiguresContainer(ContainerBuilder builder)
    {
        //add something extra to your container here
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接