我想进行一个单元测试来测试我的服务,但它们需要注入依赖项ILogger,我想用IServiceProvider存储和访问它们。对于这种情况,有NullLogger,但我所有将其添加到ServiceCollection的尝试都以以下异常告终:Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger 1[MyProject.MyService]' while attempting to activate '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);
}
}
将NullLogger添加到ServiceCollection的正确方法是什么?
为了将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();
}