C# ASP.NET Core 3.1 |如何使用服务集合进行单元测试并使用NullLogger作为ILogger实现
我想做一个单元测试来测试我的服务,但它们要求ILogger被注入依赖项,我想用IServiceProvider存储和访问它们。对于类似的情况,存在NullLogger,但我在ServiceCollection中添加它的所有尝试都以以下异常结束:C# ASP.NET Core 3.1 |如何使用服务集合进行单元测试并使用NullLogger作为ILogger实现,c#,unit-testing,asp.net-core,logging,C#,Unit Testing,Asp.net Core,Logging,我想做一个单元测试来测试我的服务,但它们要求ILogger被注入依赖项,我想用IServiceProvider存储和访问它们。对于类似的情况,存在NullLogger,但我在ServiceCollection中添加它的所有尝试都以以下异常结束:无法解析类型为“Microsoft.Extensions.Logging.ILogger 1[MyProject.MyService]”的服务,同时尝试激活“MyProject.MyService”。 public class MyService {
无法解析类型为“Microsoft.Extensions.Logging.ILogger 1[MyProject.MyService]”的服务,同时尝试激活“MyProject.MyService”。
public class MyService
{
private readonly ILogger<MyService> _logger;
public MyService(ILogger<MyService> logger)
{
_logger = logger;
}
}
public class Tests
{
private ServiceCollection _services;
private IServiceProvider _serviceProvider;
[SetUp]
public void Setup()
{
_services = new ServiceCollection();
/* ---------------------------\/--------------------------- */
_services.AddSingleton<ILogger, NullLogger>(); // Doesn't works.
// _services.AddSingleton<ILoggerFactory, NullLoggerFactory>() Another attempt.
/* ---------------------------/\--------------------------- */
_services.AddSingleton<MyService>();
_serviceProvider = _services.BuildServiceProvider();
}
[Test]
public void SomeTest()
{
// Exception will occur on line below.
var service = _serviceProvider.GetService<MyService>();
Assert.NotNull(service);
}
}
公共类MyService
{
专用只读ILogger\u记录器;
公共MyService(ILogger记录器)
{
_记录器=记录器;
}
}
公开课考试
{
私人服务收集服务;
私人IServiceProvider_服务提供商;
[设置]
公共作废设置()
{
_服务=新服务集合();
/* ---------------------------\/--------------------------- */
_services.AddSingleton();//不起作用。
//\u services.AddSingleton()再次尝试。
/* ---------------------------/\--------------------------- */
_services.AddSingleton();
_serviceProvider=_services.BuildServiceProvider();
}
[测试]
公共测试()
{
//以下第行将出现异常。
var service=_serviceProvider.GetService();
Assert.NotNull(服务);
}
}
将NullLogger添加到ServiceCollection中的正确方法是什么?为了将NullLogger添加到service collection并允许它注入到其他服务中,您应该只添加NullLoggerProvider,而不是像添加单例服务一样尝试添加它
_services.AddLogging(l => l.AddProvider(NullLoggerProvider.Instance));
完整设置方法:
[SetUp]
public void Setup()
{
_services = new ServiceCollection();
_services.AddLogging(l => l.AddProvider(NullLoggerProvider.Instance));
_services.AddSingleton<MyService>();
_serviceProvider = _services.BuildServiceProvider();
}
[设置]
公共作废设置()
{
_服务=新服务集合();
_services.AddLogging(l=>l.AddProvider(NullLoggerProvider.Instance));
_services.AddSingleton();
_serviceProvider=_services.BuildServiceProvider();
}
为了将NullLogger添加到服务集合并允许它注入到其他服务中,您应该只添加NullLoggerProvider,而不是像单例服务一样尝试添加它
_services.AddLogging(l => l.AddProvider(NullLoggerProvider.Instance));
完整设置方法:
[SetUp]
public void Setup()
{
_services = new ServiceCollection();
_services.AddLogging(l => l.AddProvider(NullLoggerProvider.Instance));
_services.AddSingleton<MyService>();
_serviceProvider = _services.BuildServiceProvider();
}
[设置]
公共作废设置()
{
_服务=新服务集合();
_services.AddLogging(l=>l.AddProvider(NullLoggerProvider.Instance));
_services.AddSingleton();
_serviceProvider=_services.BuildServiceProvider();
}
如果您只是测试MyService
那么直接实例化它会更简单:var service=newmyservice(NullLogger.Instance)
并跳过所有servicecolection
设置如果您只是测试MyService
直接实例化它会更简单:var service=newmyservice(NullLogger.Instance)
并跳过所有服务集合
设置