ASP.NET Core 3.1|如何使用服务集合进行单元测试,并使用NullLogger作为ILogger实现



我想进行一个单元测试来测试我的服务,但它们需要注入依赖项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();
}

最新更新