【问题标题】:MSTest - How do I initialize log4net for a UnitTest project?MSTest - 如何为 UnitTest 项目初始化 log4net?
【发布时间】: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


【解决方案1】:

答案是我误用了AssemblyInitialize

一旦我将调试器设置为在第一次机会异常时停止,我就能够读到我的方法不是静态的,并且我没有添加一个接受 TestContext 的参数。

如果方法必须以某种方式使用,那么属性的使用非常糟糕,如果你问我的话。不太容易被发现。

无论如何,这行得通:

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

关于不要将它用于 ASP.NET 测试的建议,草草它。它可能会运行不止一次,但这没关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2022-10-24
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多