单元测试&log4net



我在控制器中对一个操作进行了单元测试,该操作写入log4net。

当我运行我的操作时,它工作得很好——写入log4net。

然而,当我运行单元测试时,该操作不会写入log4net,但不会引发任何异常。

有人有解决方案吗?

// 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的方向发展,因为它正在测试实际发生的事情。只需确保在每次测试后对appender进行.Clear((即可。

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

在单元测试中写入磁盘上的日志或数据库会适得其反;关键在于自动化。您不应该每次运行测试时都检查日志。

如果您确实需要验证是否进行了调用以记录某些内容,那么应该模拟ILog接口并断言调用了适当的方法。

如果您使用的是一个嘲讽框架,那么这是微不足道的。如果不是,则可以创建一个实现或部分实现ILogTestLogger类,并公开额外的属性,这些属性显示给定方法被调用的次数。您的断言将检查是否按预期调用了这些方法。

下面是一个要测试的类的例子:

  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();
    }
  }

以及测试(使用Rhino.Mocks模拟ILog(:

[TestClass]
  public class MyComponentTests
  {
    [TestMethod]
    public void DoSomethingTest()
    {
      var logger = MockRepository.GenerateStub<ILog>();
      var component = new MyComponent(logger);
      var result = component.DoSomething(8);
      Assert.AreEqual("8", result);
      logger.AssertWasCalled(l => l.InfoFormat(Arg<string>.Is.Anything, Arg<int>.Is.Equal(8)));
    }
  }

尝试添加:

[assembly: log4net.Config.XmlConfigurator()]

AssemblyInfo.cs(或以任何其他方式初始化log4net(。

或者按照这个答案中的建议,尝试使用AssemblyInitialize

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

如果其他解决方案都不适用,这里还有另一个可能的解决方案。。。

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

C:Users[myself]AppDataLocalTempTestResults

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

最新更新