2010-07-30 159 views
4

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

我的问题是是否有嘲讽的事件日志,以便能够找回EventLogEntries的任何方式。不得不将条目写入实际的EventLog看起来更像集成测试,而不是单元测试。

回答

1

你应该是正确的,这是更多的集成测试。然而,你需要问问自己你真的想在这里测试什么。如果它真的是一个单元测试,并且您只想测试EventLogEntries的逻辑,那么您应该像处理任何其他外部依赖一样处理事件日志。

TDD已经带领我走过了隔离和嘲笑很多东西,模拟奇怪的东西,但最终使我从以后的维护噩梦中拯救出来。即文件IO,记录,跟踪,等...

我会坚持你的所有CRUD操作的接口边界背后的事件日志,并把它当作好像它是数据访问。如果您无法轻松创建带外EventLogEntries,那么您甚至可以考虑创建自己的实体,以表示来自事件日志的条目并使用它们。

1

这是接口真正有用的地方。你的课是否依靠IEventLog而不是EventLog。然后,在您的测试中,您可以模拟出IEventLog并验证您期望在IEventLog上调用的方法的确被调用。

如果要插入一个记录到你的类捕捉一切(class EventLogRecorder : IEventLog),你也可以这样做......做任何你需要的。

松耦合是要被去这里...

3

今天这个类似于另一个问题,我刚才已经回答 - How do I unit-test saving file to the disk?

唯一的区别是 - 你的依赖是在事件日志和相关类。让我们假设你只需要记录一些严重性的文本。

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

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

现在既然事件日志是,你不能强迫一个记录器接口的.NET类,你需要一个适配器

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事件日志
  • 写写的东西,至少读取一个验收测试验证的端到端的方案引起了一些记录,即验证一个EventLogAdapter已插正确。