如何将假货注入DI容器中?

时间:2019-01-08 14:19:56

标签: c# asp.net-core .net-core

我正在尝试将伪造品注入DI容器中,我希望它们将代替Startup中指定的伪造品使用。 我尝试过了

var topicWriterFake = A.Fake<IServiceBusTopicWriter>();
A.CallTo(() => topicWriterFake.Write(A<string>.Ignored, A<string>.Ignored))
                    .Returns(Task.CompletedTask);

var webHostBuilder = WebHost.CreateDefaultBuilder().UseStartup<Startup>();   

webHostBuilder.ConfigureServices(sc => sc.AddScoped(p => topicWriterFake));

var serviceProvider = new DependencyResolver(_webHostBuilder.Build());

var sut = serviceProvider.GetService<IStripeService>();

IStripeService依赖于IServiceBusTopicWriter。上面的代码解析IStripeService时,它仍使用在Startup中连接的实例,而不是通过测试中的ConfigureServices方法提供的实例。有什么想法可行吗?

1 个答案:

答案 0 :(得分:0)

将Web主机构建器与WebHostBuilder.ConfigureServices一起使用时,在构建Web主机时的特定时间将注册在构建器上配置的服务。但是,您的(4/30)类中的typeof(ans) Tuple{Int64,Int64} 在此之后被称为

因此,尽管您可以在构建器上使用ConfigureServices向网络主机添加服务,但是Startup仍然允许您覆盖所有内容。通常这是一件好事,但是当您要集成测试您的应用程序时,当然对您没有帮助。

我建议您使用新的WebApplicationFactory编写集成测试。它已经带有许多实用程序,可以帮助您解决integration tests

工厂允许您做的一件事是inject mock services for testing。您可以在网络主机构建器上使用ConfigureTestServices extension method

在后台,Web应用程序工厂使用IStartupConfigureServicesFilter来完成这项工作。您可以在应用程序中注册该实现,它们的ConfigureServices method将运行以为ConfigureServices类型设置服务配置管道。因此,您可以注册多个配置操作,并在最后显式运行它们。

因此,如果由于某种原因您不能或不想使用Web应用程序工厂(尽管这使集成测试容易得多),您仍然可以像下面这样明确地进行这项工作:

Startup
Startup