ASP.NET 系列:单元测试之Log4Net
使用Log组件时,我们通常自定义ILogger接口,使用Log4Net等组件进行适配来定义不同的实现类。使用Log4Net日志组件时,为了即方便单元测试又能使用配置文件,我们通过Log4Net的ILogger接口使用Log4Net,对Log4Net进行单元测试时我们可以通过使用MemoryAppender方式测试。
1.定义ILogger接口
ILogger可以通过使用日志级别的枚举类型精简方法数量,也可以不适用枚举直接定义多个方法。
public interface ILogger
{
void Debug(string format, params string[] args); void Error(string format, params string[] args); void Fatal(string format, params string[] args); void Info(string format, params string[] args); void Warn(string format, params string[] args);
}
2.创建使用Log4Net适配的实现类Log4NetAdapter
public class Log4NetAdapter : ILogger
{
private readonly ILog _rootLogger; public Log4NetAdapter(ILog rootLogger)
{
this._rootLogger = rootLogger;
} public void Debug(string format, params string[] args)
{
if (this._rootLogger.IsDebugEnabled)
{
_rootLogger.Debug(string.Format(format, args));
}
} public void Info(string format, params string[] args)
{
if (this._rootLogger.IsInfoEnabled)
{
_rootLogger.Info(string.Format(format, args));
}
} public void Warn(string format, params string[] args)
{
if (this._rootLogger.IsWarnEnabled)
{
_rootLogger.Warn(string.Format(format, args));
}
} public void Error(string format, params string[] args)
{
if (this._rootLogger.IsErrorEnabled)
{
_rootLogger.Error(string.Format(format, args));
}
} public void Fatal(string format, params string[] args)
{
if (this._rootLogger.IsFatalEnabled)
{
_rootLogger.Fatal(string.Format(format, args));
}
}
}
3.使用MemoryAppender进行单元测试
public class Log4netAdapterTest
{
private MemoryAppender _appender; [Fact]
public void Test()
{
_appender = new MemoryAppender
{
Name = "Unit Testing Appender",
Layout = new log4net.Layout.PatternLayout("%message")
};
_appender.ActivateOptions(); var root = ((Hierarchy)log4net.LogManager.GetRepository()).Root;
root.AddAppender(_appender);
root.Repository.Configured = true; ILogger logger = new Log4NetAdapter(log4net.LogManager.GetLogger("root"));
logger.Info("test {0}", "message");
Assert.Equal(_appender.GetEvents()[].MessageObject.ToString(), string.Format("test {0}", "message"));
}
}
4.创建Log4NetLoggerFactory
通常我们使用配置文件方式配置Log4Net,因此创建Log4NetLoggerFactory提供从配置文件中创建的ILog对象。
public class LoggerFactory
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(LoggerFactory)); static LoggerFactory()
{
log4net.Config.XmlConfigurator.Configure();
} public static ILogger GetLogger()
{
return new Log4NetAdapter(log);
}
}
参考的配置文件
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections> <log4net>
<root>
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
</root>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="App_Data/Logs/log.txt" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<preserveLogFileNameExtension value="true" />
<datePattern value="yyyyMMdd" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
</log4net>
运行结果:
4.通过依赖注入使用ILogger
在ASP.NET项目中使用时,通过DI容器进行注入。
protected void Application_Start()
{
//...
ObjectFactory.AddSingleton<ILogger, Log4NetAdapter>(LoggerFactory.GetLogger());
//...
}
ASP.NET 系列:单元测试之Log4Net的更多相关文章
- 补习系列(8)-springboot 单元测试之道
目录 目标 一.About 单元测试 二.About Junit 三.SpringBoot-单元测试 项目依赖 测试样例 四.Mock测试 五.最后 目标 了解 单元测试的背景 了解如何 利用 spr ...
- ASP.NET Core搭建多层网站架构【3-xUnit单元测试之简单方法测试】
2020/01/28, ASP.NET Core 3.1, VS2019, xUnit 2.4.0 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[3-xUnit单元测试 ...
- ASP.NET Core搭建多层网站架构【12-xUnit单元测试之集成测试】
2020/02/01, ASP.NET Core 3.1, VS2019, xunit 2.4.1, Microsoft.AspNetCore.TestHost 3.1.1 摘要:基于ASP.NET ...
- ASP.NET 系列:单元测试
单元测试可以有效的可以在编码.设计.调试到重构等多方面显著提升我们的工作效率和质量.github上可供参考和学习的各种开源项目众多,NopCommerce.Orchard等以及微软的asp.net m ...
- 使用VisualStudio进行单元测试之二
借着工作忙的借口,偷了两天懒,今天继续单元测试之旅.前面说了如何进行一个最简单的单元测试,这次呢就跟大家一起来熟悉一下,在visual studio中如何进行数据驱动的单元测试. 开始之前先来明确一下 ...
- iOS 单元测试之XCTest详解(一)
iOS 单元测试之XCTest详解(一) http://blog.csdn.net/hello_hwc/article/details/46671053 原创blog,转载请注明出处 blog.csd ...
- 玩转单元测试之Testing Spring MVC Controllers
玩转单元测试之 Testing Spring MVC Controllers 转载注明出处:http://www.cnblogs.com/wade-xu/p/4311657.html The Spri ...
- 玩转单元测试之WireMock -- Web服务模拟器
玩转单元测试之WireMock -- Web服务模拟器 WireMock 是一个灵活的库用于 Web 服务测试,和其他测试工具不同的是,WireMock 创建一个实际的 HTTP服务器来运行你的 We ...
- 单元测试之NSNull 检测
本文主要讲 单元测试之NSNull 检测,在现实开发中,我们最烦的往往就是服务端返回的数据中隐藏着NSNull的数据,一般我们的做法是通过[data isKindOfClass:[NSNull cla ...
随机推荐
- Hessian 二进制RPC协议框架
Hessian是一个由Caucho Technology开发的轻量级二进制RPC协议. 和其他Web服务的实现框架不同的是,Hessian是一个使用二进制轻量级的Web服务协议的框架,免除了许多附加的 ...
- 0020 Java学习笔记-面向对象-变量
变量分为哪些 成员变量:类里面,方法外面定义的变量 实例变量:没有用static修饰的变量,属于对象:存在期:创建实例-销毁实例:作用域:与该实例的生存范围相同 类变量:用static修饰的变量,属于 ...
- DGbroker主备切换
1.检查DG是否正常 DGMGRL> show configuration; Configuration - dgc Protection Mode: MaxProtection Databas ...
- 烂泥:学习ssh之ssh无密码登陆
本文由秀依林枫提供友情赞助,首发于烂泥行天下 最近一个月没有写过文章,主要是刚刚换的新工作.新公司服务器OS使用的是ubuntu server版,和以前熟悉的centos还是有很多不同的. 刚好这几天 ...
- WPF捕获未处理的异常
WPF程序中,对于异常的捕获一般使用try/catch块.就像程序中的bug一样,很难保证程序中所有的异常都能够通过try/catch捕获.如果异常没有被捕获,轻则影响用户体验,严重时会导致数据丢失 ...
- .Net程序员之Python基础教程学习----函数和异常处理[Fifth Day]
今天主要记录,Python中函数的使用以及异常处理. 一.函数: 1.函数的创建以及调用. def Add(val1,val2): return val1+val2; print Add( ...
- 基于网格的波动方程模拟(Wave equation on mesh)附源码
波动方程是偏微分方程 (PDE) 里的经典方程,它在物理学中有大量应用并经常用来解释空间中的能量传播.波动方程是一个依赖时间的方程,它解释了系统状态是如何随着时间的推移而发生变化.在下面模拟波动方程时 ...
- UVa11549计算器谜题[floyd判圈]
题意: 有个老式计算器,每次只能记住一个数字的前n位.现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少.例如,n=1,k=6,那么一次显示:6,3,9,1... 白书上的题 set, ...
- U3D的飞船太空射击例子中,使用coroutine
coroutine 协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西.线程与协同程序的主要区别在于,一个具有多线程的程序 ...
- java中使用二重循环打印图形
如图所示:打印沙漏图形 1:因为外层循环控制图形行数,所以首先判断这四个选项能否循环五次 2:以上四个循环的表达式都能循环五次,我们从内层循环入手. A:int i=0;i<5;i++ 当i=1 ...