11

我有一个用于测试ASP.NET MVC项目的Visual Studio单元测试项目。MSTest - 如何初始化UnitTest项目的log4net?

添加组件级log4net.Config.XmlConfigurator属性AssemblyInfo.cs中不工作,其他人等都有发现,他们不得不使用直接调用log4net.Config.XmlConfigurator.Configure();

的问题是,这可怎么一做单元测试?在类方法上使用Microsoft.VisualStudio.TestTools.UnitTesting.AssemblyInitialize属性的答案不起作用。

对我来说,这段代码导致InvalidOperationException记录在输出窗口和早期的测试会话炸弹中。

​​

阅读该文档,MSDN说,不要对测试项目ASP.NET使用AssemblyInitialize因为它们可能被调用一次以上。

那么如何做到这一点,以便在任何测试运行之前配置log4net?

+2

我可以提出另一种方法,通过使用抽象到log4net,像ILogger这样的定义调试,信息,警告等。 这样,你可以提供不同的ILogger实现,一个使用log4net做实际的日志记录和用于实际的应用程序,另一类像InMemoryLogger,这在UnitTesting中可以非常方便地使用。您甚至可以模拟(使用moq)ILogger,这在直接使用log4net时是不可能的。 –

+0

你的方法更好。虽然我做抽象日志记录,但我不会记录日志,因为我从不需要切换日志记录组件 - 它们无论如何都是可配置的 - 所以如果log4net不得不离开的那一天,我只需要重新编码我的ILogger工厂。在这种情况下,我只是想在调试器中看到我的日志语句。 –

回答

22

答案是我误用了AssemblyInitialize

一旦我设置调试器暂停第一次机会例外,我能够读取我的方法不是静态的,我不会添加一个参数接受TestContext它。

如果方法必须是某种方式,如果你问我,那么这个方法就非常糟糕。不是很好发现。

不管怎么说,这个工作:

[TestClass] 
public static class Startup 
{ 
    [AssemblyInitialize] 
    public static void Configure(TestContext tc) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 
    } 
} 

关于建议不要用这个ASP.NET测试,草皮它。它可能会运行不止一次,但这并不重要。