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

标签 c# unit-testing asp.net-core logging

我想做一个单元测试来测试我的服务,但它们需要 ILogger 依赖注入(inject),我想用 IServiceProvider 存储和访问它们。对于这种情况,有 NullLogger,但我将其添加到 ServiceCollection 中的所有尝试都以以下异常结束:
无法解析类型为“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);
    }
}

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

最佳答案

为了将 NullLogger 添加到服务集合并允许它注入(inject)其他服务,您应该只添加 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();
}

关于c# - ASP.NET 核心 3.1 |如何使用服务集合进行单元测试并使用 NullLogger 作为 ILogger 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63649140/

相关文章:

c# - .NET 报告教程

unit-testing - 运行时错误运行 Jest : in React

c++ - 测试 protobuf 消息的覆盖率

c# - 如何使用 iTextSharp 读取线条注释外观的宽度?

c# - XUnit 测试的 EF Core DbContext 并发问题

c# - 如何使用 Microsoft Shims 检测方法调用是 DAMP

asp.net-core - 如何更新(在内存中)IConfigurationSection 的值

c# - Spring Boot、Freemarker、MVC 单元测试、Csrf

c# - Razor View 的有界属性在发布后未更新

c# - 添加迁移时无法加载文件或程序集网络标准