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 中的正确方法是什么?
为了将 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)
| 归档时间: |
|
| 查看次数: |
1351 次 |
| 最近记录: |