las*_*2d2 1 .net c# dependency-injection nunit-3.0 asp.net-core
我正在为以下扩展方法编写单元测试:
public static void AddMyServices(this IServiceCollection services)
{
services.AddScoped<IServiceA, ServiceA>();
}
Run Code Online (Sandbox Code Playgroud)
这是我必须确认ServiceA已注入的内容。
[Test]
public void Should_Resolve_ServiceA() {
// Arrange
var services = new ServiceCollection();
// Act
services.AddMyServices();
var serviceProvider = services.BuildServiceProvider();
var actual = serviceProvider.GetService<IServiceA>();
// Assert
Assert.IsNotNull(actual);
}
Run Code Online (Sandbox Code Playgroud)
上面的测试确实确保服务已被注入。然而,services.AddSingleton和services.AddTransient也通过测试。
是否有解决方案只获取范围注入的服务,以便我可以确保以正确的方式注入它?
我知道对于上面的简化示例,我可以为存根方法创建存根IServiceCollection并检查ReceivedCalls存根方法。但是,我试图避免这样做,因为AddScope我的实际扩展方法中有很多语句,并且上述单元测试的部分目的是确保已注入特定服务的所有依赖项。所以GetService<T>是做测试的首选方法。
在 中添加服务后ServiceCollection,您应该能够返回ServiceDescriptor以验证服务范围。请注意,这ServiceCollection是一个IEnumerable<ServiceDescriptor>. 所以你可以像这样检查它:
// Assert
Assert.AreEqual(services.FirstOrDefault(e => e.ServiceType == typeof(IServiceA))?.Lifetime, ServiceLifetime.Scoped);
Run Code Online (Sandbox Code Playgroud)
您不需要从服务集合构建服务提供者。请注意,如果IServiceA未注册,上面的代码也会失败。这取决于您的要求,您可以根据需要修改代码。我刚刚展示了主要思想。
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |