我在我的控制器中测试一个动作的单元测试,动作写入log4net。
当我运行我的操作时效果很好 - 写入log4net。
但是,当我运行单元测试时 - 该操作不会写入log4net但不会抛出任何异常。
有没有人有解决方案?
答案 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
底线,我现在写的任何单元测试都将使用完整的绝对日志文件路径,而不是相对的。