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 ...
随机推荐
- HDFS
1.HDFS shell 1.0查看帮助 hadoop fs -help <cmd> 1.1上传 hadoop fs -put <linux上文件> <hdfs上的路径& ...
- kill
向一个/一些进程发送一个信号 $kill [-slL] -s指定发送的信号,可以使用名称或者信号编号 -l列出当前系统的所有信号 $kill -l 1) SIGHUP 2) SIGINT 3) SIG ...
- Bootstrap 学习(1)
简介 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷. Bootst ...
- Java入门(二)——果然断更的都是要受惩罚的。。。
断更了一个多月,阅读量立马从100+跌落至10-,虽说不是很看重这个,毕竟只是当这个是自己的学习笔记,但有人看,有人评论,有人认同和批评的感觉还是很巴适的,尤其以前有过却又被剥夺的,惨兮兮的. 好好写 ...
- Android View和ViewGroup
View和ViewGroup Android的UI界面都是由View和ViewGroup及其派生类组合而成的. 其中,View是所有UI组件的基类,而 ViewGroup是容纳这些组件的容器,其本身也 ...
- 中国移动测试大会 PPT 和视频
PPT网盘链接:http://pan.baidu.com/s/1c0prdoG优酷专辑:http://v.youku.com/v_show/id_XMTI5NjExNjIwOA==.html?f=25 ...
- POJ2796Feel Good[单调栈]
Feel Good Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13376 Accepted: 3719 Case T ...
- unity3d 的Quaternion.identity和transform.rotation区别是什么
Quaternion.identity就是指Quaternion(0,0,0,0),就是每旋转前的初始角度,是一个确切的值,而transform.rotation是指本物体的角度,值是不确定的,比如可 ...
- MyBatis配置文件解析
MyBatis配置文件解析(概要) 1.configuration:根元素 1.1 properties:定义配置外在化 1.2 settings:一些全局性的配置 1.3 typeAliases:为 ...
- ACCP7.0优化Myschool内侧题
1) 在SQL Server 中,为数据库表建立索引能够(C ). 索引:是SQL SERVER编排数据的内部方法,是检索表中数据的直接通道 建立索引的作用:大大提高了数据库的检索速度,改善数据库性能 ...