我正在尝试将伪造品注入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方法提供的实例。有什么想法可行吗?
答案 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