【发布时间】:2014-09-01 18:54:22
【问题描述】:
我有一个用于测试 ASP.NET MVC 项目的 Visual Studio 单元测试项目。
将程序集级 log4net.Config.XmlConfigurator 属性添加到 AssemblyInfo.cs 不起作用,SO 上的其他人发现他们必须直接调用 log4net.Config.XmlConfigurator.Configure();
问题是,如何为单元测试做到这一点?在类方法上使用Microsoft.VisualStudio.TestTools.UnitTesting.AssemblyInitialize 属性的答案不起作用。
对我来说,这段代码会在输出窗口中记录一个InvalidOperationException,并且测试会话会提前爆炸。
[TestClass]
public sealed class Startup
{
[AssemblyInitialize]
public void Configure()
{
System.Diagnostics.Debug.Write("Microsoft.VisualStudio.TestTools.UnitTesting.AssemblyInitialize");
}
}
阅读文档后,MSDN 表示不要在 ASP.NET 的测试项目中使用 AssemblyInitialize,因为它们可能会被多次调用。
那么如何做到这一点,以便在运行任何测试之前配置 log4net?
【问题讨论】:
-
我可以建议另一种方法,通过对 log4net 使用抽象,例如定义调试、信息、警告等的 ILogger。这样,您可以为 ILogger 提供不同的实现,一个使用 log4net 来进行实际的日志记录并在您的实际应用程序中使用,以及其他类似 InMemoryLogger 的东西,在 UnitTesting 中使用非常方便。然后,您甚至可以模拟(使用 moq)ILogger,这在直接使用 log4net 时是不可能的。
-
你的方法更好。虽然我进行抽象日志记录,但我不使用日志记录进行 DI,因为我从来不需要切换日志记录组件 - 无论如何它们都是如此可配置的 - 所以如果有一天 log4net 不得不离开,我只是重新编码我的 ILogger 工厂。在这种情况下,我只想在调试器中查看我的日志记录。
标签: c# asp.net-mvc unit-testing visual-studio-2012 log4net-configuration