LibLog - 断言对记录器的调用

时间:2016-09-01 13:30:51

标签: c# unit-testing liblog

使用LibLog时,是否可以断言对记录器的调用?鉴于wiki列出了以下用法示例:

public class MyClass
{
    private static readonly ILog Logger = LogProvider.For<MyClass>(); 
}

此处记录器是一个隐藏在消费者手中的实现细节,这是使用该库的最大好处。这样库消费者就不必担心如何实例化记录器。看看这篇博文:

http://dhickey.ie/2015/06/capturing-log-output-in-tests-with-xunit2/

似乎添加了大量的锅炉板以捕获日志输出,我不完全确定该方法,因为它在单元测试中也使用了重定向的Serilog输出,这似乎很奇怪库应该只依赖于日志记录抽象吗?

我目前唯一能想到的选择是:

注入记录器 - 对于库的使用者来说这可能是奇怪的,然后每个库都会带有它需要注入的自己的ILogger定义,从而破坏了抽象的优点。

连接到真实的日志记录框架 - 将LibLog的当前LogProvider设置为使用Log4Net或类似,然后以某种方式尝试将模拟/存根记录器注入Log4Net,并通过代理断言调用。

任何相对简单的断言对记录器的调用的方法都会受到赞赏,但我怀疑并行测试执行会导致问题,即使可以在上面的记录器上断言调用吗?

2 个答案:

答案 0 :(得分:0)

我在项目中做了什么:

我已经创建了我的LoggerFactory。它公开了与NLogger相同的静态方法。

public class LoggerFactory
{
    private static ILoggerFactoryStrategy _loggerFactoryStrategy = new DummyLoggerFactoryStrategy();

    public static void Initialize(ILoggerFactoryStrategy loggerFactoryStrategy)
    {
        _loggerFactoryStrategy = loggerFactoryStrategy;
    }

    public ILogger GetLogger<T>()
    {
        return _loggerFactoryStrategy.GetLogger<T>();
    }

    ....
}

虚拟策略只能写入调试输出或什么都不做。另一种策略可能看起来像:

public class LoggerFactoryStrategy : ILoggerFactoryStrategy
{
    public ILogger GetLogger<T>()
    {
        //create LibLog instance instead with LogProvider.For<T>()
        var nlogger = LogManager.GetLogger(typeof(T).Name); //create instance of NLogger
        return new NLogLogger(nlogger);
    }
}

NlogLogger包装器可能像

一样
internal class NLogLogger : ILogger
{
    private readonly Logger _logger;

    public NLogLogger(Logger logger)
    {
        _logger = logger;
    }

    public void Debug(string message)
    {
        _logger.Debug(message);
    }

    public void Warn(string message, params object[] args)
    {
        _logger.Warn(message, args);
    }

    public void Info(Exception exception)
    {
        _logger.Info(exception);
    }

    ......
}

当应用程序启动时,我使用适当的策略初始化它,使用NLogger

如果我想测试对logger的调用,我可以使用模拟策略。 此方法允许您在解决方案中删除对记录器库的引用,但根项目除外,如果将来需要,可以从一个项目切换到另一个。

此外,这使我们能够在PCL项目中使用NLogger。

答案 1 :(得分:0)

在几乎所有记录器的日志记录配置中,您可以配置然后在日志失败时抛出异常。

来自nlog的样本

<nlog throwExceptions="true">
 ... your nlog config
</nlog>

但是在LibLog创建的抽象中你丢失了这个功能