Mig*_*Mig 6 c# unit-testing liblog
使用LibLog时,是否可以断言对记录器的调用?鉴于wiki列出了以下用法示例:
public class MyClass
{
private static readonly ILog Logger = LogProvider.For<MyClass>();
}
Run Code Online (Sandbox Code Playgroud)
这里的记录器是一个隐藏在消费者手中的实现细节,这是使用这个库的最大好处.这样库消费者就不必担心如何实例化记录器.看看这篇博文:
http://dhickey.ie/2015/06/capturing-log-output-in-tests-with-xunit2/
似乎添加了大量的锅炉板以捕获日志输出,我不完全确定该方法,因为它在单元测试中也使用了重定向的Serilog输出,这看起来很奇怪,因为库应该只依赖关于日志抽象?
我目前唯一能想到的选择是:
注入记录器 - 这对于库的使用者来说可能是奇怪的,然后每个库都会带有它自己的ILogger
需要注入的定义,从而破坏了抽象的优点.
连接到真实的日志记录框架 - 将LibLog的当前LogProvider设置为使用Log4Net或类似,然后以某种方式尝试将模拟/存根记录器注入Log4Net,并通过代理断言调用.
任何相对简单的断言对记录器的调用的方法都会受到赞赏,但我怀疑并行测试执行会导致问题,即使可以在上面的记录器上断言调用?
我在项目中做了什么:
我已经创建了 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>();
}
....
}
Run Code Online (Sandbox Code Playgroud)
虚拟策略可以只编写调试输出或不执行任何操作。另一种策略可能类似于:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
......
}
Run Code Online (Sandbox Code Playgroud)
NLogger
当应用程序启动时,我使用幕后使用的正确策略对其进行初始化。
如果我想测试对记录器的调用,我可以使用模拟策略。这种方法允许您在整个解决方案中删除对记录器库的引用(根项目除外),并允许您在将来需要时从一个记录器库切换到另一个项目。
此外,这使我们能够在 PCL 项目中使用 NLogger。
归档时间: |
|
查看次数: |
724 次 |
最近记录: |