单元测试& log4net的

时间:2011-11-17 06:17:23

标签: asp.net asp.net-mvc-3 unit-testing

我在我的控制器中测试一个动作的单元测试,动作写入log4net。

当我运行我的操作时效果很好 - 写入log4net。

但是,当我运行单元测试时 - 该操作不会写入log4net但不会抛出任何异常。

有没有人有解决方案?

5 个答案:

答案 0 :(得分:20)

// ARRANGE
var memoryAppender = new MemoryAppender();
BasicConfigurator.Configure(memoryAppender);

// ACT
_sut.DoWhatever();

// ASSERT - using xunit - change the expression to fit your purposes
Assert.True(memoryAppender.GetEvents().Any(le => le.Level == Level.Warn), "Expected warning messages in the logs");

您没有 需要 通过使用日志记录界面添加另一个间接层(如果您不想这样做)。我已经使用抽象的方式多年了,但现在我正在使用MemoryAppender,因为它正在测试实际发生的事情。每次测试后,请确保.Clear()appender。

答案 1 :(得分:8)

Log4net不会抛出异常:http://logging.apache.org/log4net/release/faq.html

在单元测试中写入磁盘或数据库中的日志会适得其反;重点是自动化。每次运行测试时都不必检查日志。

如果您确实需要验证是否已对某些内容进行了调用,则应该模拟ILog接口并声明已调用相应的方法。

如果您使用的是模拟框架,这是微不足道的。如果您不是,则可以创建实现或部分实现TestLogger的{​​{1}}类,并公开显示给定方法调用次数的额外属性。您的断言将检查方法是否按预期调用。

以下是要测试的类的示例:

ILog

和测试(使用Rhino.Mocks模拟ILog):

  public class MyComponent
  {
    private readonly ILog _log;

    public MyComponent(ILog log)
    {
      _log = log;
    }

    public string DoSomething(int arg)
    {
      _log.InfoFormat("Argument was [{0}]", arg);
      return arg.ToString();
    }
  }

答案 2 :(得分:6)

尝试添加:

[assembly: log4net.Config.XmlConfigurator()]

AssemblyInfo.cs(或任何其他方式的init log4net)。找到了这个答案here

答案 3 :(得分:1)

这是您的log4net配置。现在它可能位于web / bin中的web.config或log4net.config文件中。您必须将它放在一个公共位置,并通过Web应用程序和测试使其可被发现。或者你必须将它放入你的unittest.project => app.config文件中。但是如果你有很多测试项目,它会在多个地方重复。所以理想的做法是把它放在一个共同的地方。

答案 4 :(得分:1)

如果没有其他解决方案适合您,这是另一种可能的解决方案......

尝试将日志文件写入c盘的根目录。默认情况下,我将log4net设置为写入当前目录,该目录始终是单元测试运行的目录吗?错!我正在使用MS Unit Test运行带有vs 2012的Windows 8,它将文件写入本地临时目录,该目录在单元测试完成后被删除。在我的设置中,它将文件写入此处:

C:\Users\[myself]\AppData\Local\Temp\TestResults

底线,我现在写的任何单元测试都将使用完整的绝对日志文件路径,而不是相对的。