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

Naz*_*nyk 5 c# logging unit-testing asp.net-core

我想进行单元测试来测试我的服务,但它们需要 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

将 NullLogger 添加到 ServiceCollection 中的正确方法是什么?

Naz*_*nyk 9

为了将 NullLogger 添加到服务集合并允许其注入其他服务,您应该仅添加 NullLoggerProvider,而不是尝试像单例服务一样添加它。

_services.AddLogging(l => l.AddProvider(NullLoggerProvider.Instance));
Run Code Online (Sandbox Code Playgroud)

完整设置方法:

[SetUp]
public void Setup()
{
    _services = new ServiceCollection();
    _services.AddLogging(l => l.AddProvider(NullLoggerProvider.Instance));
    _services.AddSingleton<MyService>();
    _serviceProvider = _services.BuildServiceProvider();
}
Run Code Online (Sandbox Code Playgroud)