模拟EventLog和EventLogEntry

时间:2010-07-30 15:24:46

标签: c# windows unit-testing mocking event-log

我正在尝试为报告EventLog中的条目的应用程序编写单元测试。现在当我运行单元测试时,我不得不创建一个临时的EventLog,向它写入条目,并在完成后删除日志。我这样做是因为我需要取回没有构造函数的EventLogEntry对象。

我的问题是有没有办法模拟EventLog能够取回EventLogEntries。必须将条目写入实际的EventLog似乎更像是集成测试,而不是单元测试。

3 个答案:

答案 0 :(得分:3)

这与我刚才回答的另一个问题类似 - How do I unit-test saving file to the disk?

唯一的区别是 - 您的依赖项是EventLog和相关类。我们假设你只需要记录一些严重性的文本。

struct Event 
{ 
  public string Description {get; set;} 
  public Severity Severity {get; set;}
}

interface Logger
{
  void WriteEvent(Event e);
  void IEnumerable<Event> GetEvents();
}

现在,由于EventLog是一个.Net类,你不能强制使用Logger接口,你需要一个适配器

public EventLogAdapter : Logger {
 //delegates to .Net framework's EventLog  
 // Also EventLogEntry is internal to this class - entries will be mapped to Event structs
}

现在我们所需要的只是测试......很容易就像UIA或123

  • 依赖于Logger的类的单元测试将使用模拟。
  • 编写集成测试以验证EventLogAdapter的API实际上是否从Windows EventLog写入内容和读取
  • 编写至少一个验收测试,验证端到端场景导致某些日志记录,即验证是否正确插入了EventLogAdapter。

答案 1 :(得分:1)

您更正确的是,这更像是集成测试。但是你需要问问自己你在这里尝试测试的是什么。如果它确实是一个单元测试,并且您只想测试EventLogEntries上的逻辑,那么您应该将事件日志视为任何其他外部依赖项。

TDD让我走上了孤立和嘲笑许多感觉嘲笑的事情的道路,但最终还是让我免于维护噩梦。即文件IO,记录,跟踪等......

我会将所有CRUD操作都粘贴到接口边界后面的事件日志中,并将其视为数据访问。如果您无法在带外轻松创建EventLogEntries,那么您甚至可以考虑创建自己的实体来表示事件日志中的条目并使用它们。

答案 2 :(得分:1)

这是接口非常有用的地方。让你的类依赖于IEventLog而不是EventLog。然后,在您的测试中,您可以模拟IEventLog并验证您希望在IEventLog上调用的方法确实被调用。

如果你想在你的班级中插入录音机以捕捉所有内容(class EventLogRecorder : IEventLog),你也可以这样做......并做你需要的任何事情。

松耦合是你想要去的地方......