在StartupClass运行后如何获得所有服务?
我们有一个启动配置服务类,该类 运行多个依赖项注入。
serviceCollection.AddScoped<IDepartmentRepository, DepartmentRepository>();
serviceCollection.AddScoped<IDepartmentAppService, DepartmentAppService>();
团队正在使用Xunit测试项目,并希望获取Xunit的所有服务集合列表。
需要以下服务:
new WebHostBuilder()
.UseContentRoot("C:\\Test\\Test.WebAPI")
.UseEnvironment("Development")
.UseConfiguration(new ConfigurationBuilder()
.SetBasePath("C:\\Test\\Test.WebAPI")
.AddJsonFile("appsettings.json")
.Build()).UseStartup<Startup>());
答案 0 :(得分:0)
ServiceCollection
中的服务由ServiceDescriptor
类表示。通过将ConfigureTestServices
方法链接到您的WebHostBuilder
(您必须安装Microsoft.AspNetCore.TestHost
软件包),可以获得所有服务描述符的列表
using Microsoft.AspNetCore.TestHost;
....
IWebHost CreateWebHost(out ServiceDescriptor[] allServices)
{
ServiceDescriptor[] grabbedServices = null;
var host = new WebHostBuilder()
// ... other stuff ...
.UseStartup<Startup>()
// add the following call:
.ConfigureTestServices(services => {
// copy all service descriptors
grabbedServices = services.ToArray();
})
// build the host now to trigger the above chain
.Build();
allServices = grabbedServices;
return host;
}
这样方便使用:
[Fact]
public void TestSomething()
{
// arrange
var host = CreateWebHost(out var services);
// ... do something with the services
// act
// assert
}
我们必须使用ConfigureTestServices
(而不是ConfigureServices
)的原因是,ConfigureServices
总是在Startup
类中的方法之前被调用,而{{1} }。
当然,也可以将对ConfigureTestServices
的引用存储在变量/字段中,并在必要时枚举服务。
答案 1 :(得分:0)
因此,我了解您要测试服务的问题,并且在将它们加载到测试项目中时遇到问题。 我会说你不需要。每次测试单一服务时,在单元测试中。您直接实例化此服务:
var target= new ServiceToTest();
因此,您从测试项目中引用了testED项目。如果您的实现是内部的,请向您的testED项目添加一个AssemblyInfo.cs文件,并将以下内容放入其中:
[assembly: InternalsVisibleTo("MyTestProject")]
每当测试MyServiceToTest1时,如果它依赖于MyServiceTest2,则不必加载或实例化MyServiceTest2。相反,您嘲笑它,例如与 moq 。