C# 断言服务已作为作用域服务注入

C# 断言服务已作为作用域服务注入,c#,.net,asp.net-core,dependency-injection,nunit-3.0,C#,.net,Asp.net Core,Dependency Injection,Nunit 3.0,我正在为以下扩展方法编写单元测试: 公共静态void AddMyServices(此IServiceCollection服务) { services.addScope(); } 以下是我必须确认的服务A已注入 [测试] 应解决公共无效问题{ //安排 var services=newservicecolection(); //表演 services.AddMyServices(); var serviceProvider=services.BuildServiceProvider(); var

我正在为以下扩展方法编写单元测试:

公共静态void AddMyServices(此IServiceCollection服务)
{
services.addScope();
}
以下是我必须确认的
服务A
已注入

[测试]
应解决公共无效问题{
//安排
var services=newservicecolection();
//表演
services.AddMyServices();
var serviceProvider=services.BuildServiceProvider();
var actual=serviceProvider.GetService();
//断言
Assert.IsNotNull(实际值);
}
上面的测试确实确保了服务已被注入。但是,
services.AddSingleton
services.AddTransient
也通过了测试

是否有一种解决方案只获取作用域注入服务,这样我就可以确保以正确的方式注入服务


我知道,对于上面的简化示例,我可以为
IServiceCollection
创建存根,并检查存根方法上的
ReceivedCalls
。然而,我试图避免这样做,因为在我真正的扩展方法中有很多
AddScope
语句,上面单元测试的部分目的是确保注入了特定服务的所有依赖项。因此,
GetService
是进行测试的首选方法。

一旦将服务添加到
servicecolection
中,您应该能够获取
服务描述符来验证服务范围。请注意,
servicecolection
是一个
IEnumerable
。所以你可以这样检查:

// Assert
Assert.AreEqual(services.FirstOrDefault(e => e.ServiceType == typeof(IServiceA))?.Lifetime, ServiceLifetime.Scoped);
您不需要从服务集合构建服务提供者。
请注意,如果未注册
IServiceA
,上述代码也会失败。这取决于您的需求,您可以根据需要修改代码。我刚刚展示了主要思想。

一旦服务添加到
服务集合中
,您应该能够返回
服务描述符
,以验证服务范围。请注意,
servicecolection
是一个
IEnumerable
。所以你可以这样检查:

// Assert
Assert.AreEqual(services.FirstOrDefault(e => e.ServiceType == typeof(IServiceA))?.Lifetime, ServiceLifetime.Scoped);
您不需要从服务集合构建服务提供者。
请注意,如果未注册
IServiceA
,上述代码也会失败。这取决于您的需求,您可以根据需要修改代码。我刚刚展示了主要思想。

我怀疑是否有办法判断是否使用默认DI库。通过创建一个实例,打开自己的作用域,创建另一个实例,然后如果这两个实例是相同的,那么它就不是singleton。另外,只要创建两个实例,如果它们是相同的,就不是暂时的。如果您使用的是ASP.NETCore,上述代码甚至不应该工作,因为范围服务需要在范围上下文中解析,即<代码>使用var scope=sp.CreateScope();var actual=scope.ServiceProvider.GetService()我怀疑是否有办法判断是否使用默认DI库。通过创建一个实例,打开自己的作用域,创建另一个实例,然后如果这两个实例是相同的,那么它就不是singleton。另外,只要创建两个实例,如果它们是相同的,就不是暂时的。如果您使用的是ASP.NETCore,上述代码甚至不应该工作,因为范围服务需要在范围上下文中解析,即<代码>使用var scope=sp.CreateScope();var actual=scope.ServiceProvider.GetService()