Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Core 3.1 |如何使用服务集合进行单元测试并使用NullLogger作为ILogger实现_C#_Unit Testing_Asp.net Core_Logging - Fatal编程技术网

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

C# ASP.NET Core 3.1 |如何使用服务集合进行单元测试并使用NullLogger作为ILogger实现,c#,unit-testing,asp.net-core,logging,C#,Unit Testing,Asp.net Core,Logging,我想做一个单元测试来测试我的服务,但它们要求ILogger被注入依赖项,我想用IServiceProvider存储和访问它们。对于类似的情况,存在NullLogger,但我在ServiceCollection中添加它的所有尝试都以以下异常结束:无法解析类型为“Microsoft.Extensions.Logging.ILogger 1[MyProject.MyService]”的服务,同时尝试激活“MyProject.MyService”。 public class MyService {

我想做一个单元测试来测试我的服务,但它们要求ILogger被注入依赖项,我想用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);
    }
}
公共类MyService
{
专用只读ILogger\u记录器;
公共MyService(ILogger记录器)
{
_记录器=记录器;
}
}
公开课考试
{
私人服务收集服务;
私人IServiceProvider_服务提供商;
[设置]
公共作废设置()
{
_服务=新服务集合();
/* ---------------------------\/--------------------------- */
_services.AddSingleton();//不起作用。
//\u services.AddSingleton()再次尝试。
/* ---------------------------/\--------------------------- */
_services.AddSingleton();
_serviceProvider=_services.BuildServiceProvider();
}
[测试]
公共测试()
{
//以下第行将出现异常。
var service=_serviceProvider.GetService();
Assert.NotNull(服务);
}
}

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

为了将NullLogger添加到service collection并允许它注入到其他服务中,您应该只添加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();
}
[设置]
公共作废设置()
{
_服务=新服务集合();
_services.AddLogging(l=>l.AddProvider(NullLoggerProvider.Instance));
_services.AddSingleton();
_serviceProvider=_services.BuildServiceProvider();
}

为了将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();
}
[设置]
公共作废设置()
{
_服务=新服务集合();
_services.AddLogging(l=>l.AddProvider(NullLoggerProvider.Instance));
_services.AddSingleton();
_serviceProvider=_services.BuildServiceProvider();
}

如果您只是测试
MyService
那么直接实例化它会更简单:
var service=newmyservice(NullLogger.Instance)
并跳过所有
servicecolection
设置如果您只是测试
MyService
直接实例化它会更简单:
var service=newmyservice(NullLogger.Instance)
并跳过所有
服务集合
设置