我正在尝试为报告事件日志中的条目的应用程序编写单元测试。现在,当我运行单元测试时,我不得不创建一个临时EventLog,向它写入条目,并在完成时删除日志。我这样做是因为我需要找回没有构造函数的EventLogEntry对象。模拟事件日志和事件日志条目
我的问题是是否有嘲讽的事件日志,以便能够找回EventLogEntries的任何方式。不得不将条目写入实际的EventLog看起来更像集成测试,而不是单元测试。
我正在尝试为报告事件日志中的条目的应用程序编写单元测试。现在,当我运行单元测试时,我不得不创建一个临时EventLog,向它写入条目,并在完成时删除日志。我这样做是因为我需要找回没有构造函数的EventLogEntry对象。模拟事件日志和事件日志条目
我的问题是是否有嘲讽的事件日志,以便能够找回EventLogEntries的任何方式。不得不将条目写入实际的EventLog看起来更像集成测试,而不是单元测试。
你应该是正确的,这是更多的集成测试。然而,你需要问问自己你真的想在这里测试什么。如果它真的是一个单元测试,并且您只想测试EventLogEntries的逻辑,那么您应该像处理任何其他外部依赖一样处理事件日志。
TDD已经带领我走过了隔离和嘲笑很多东西,模拟奇怪的东西,但最终使我从以后的维护噩梦中拯救出来。即文件IO,记录,跟踪,等...
我会坚持你的所有CRUD操作的接口边界背后的事件日志,并把它当作好像它是数据访问。如果您无法轻松创建带外EventLogEntries,那么您甚至可以考虑创建自己的实体,以表示来自事件日志的条目并使用它们。
这是接口真正有用的地方。你的课是否依靠IEventLog而不是EventLog。然后,在您的测试中,您可以模拟出IEventLog并验证您期望在IEventLog上调用的方法的确被调用。
如果要插入一个记录到你的类捕捉一切(class EventLogRecorder : IEventLog
),你也可以这样做......做任何你需要的。
松耦合是要被去这里...
今天这个类似于另一个问题,我刚才已经回答 - 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