模拟事件日志和事件日志条目

5
我正在尝试为一个报告EventLog中条目的应用程序编写单元测试。目前,当我运行单元测试时,我必须创建一个临时EventLog,向其中写入条目,并在完成后删除该日志。我这样做是因为我需要获取EventLogEntry对象,但它们没有构造函数。
我的问题是是否有任何方法来模拟EventLog以能够获取EventLogEntries。对实际EventLog编写条目似乎更像是集成测试而不是单元测试。
3个回答

4

这与我今天刚回答的另一个问题类似 - 如何对保存到磁盘的文件进行单元测试?

唯一的区别是,你的依赖关系是事件日志和相关类。假设你只需要记录某些文本并标记其严重程度。

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

你说得没错,这更像是一个集成测试。但是你需要问问自己,你真正想要测试什么。如果这确实是一个单元测试,并且你只想测试EventLogEntries上的逻辑,那么你应该像对待任何其他外部依赖一样处理事件日志。

TDD让我隔离和模拟了很多看起来很奇怪的东西,但最终帮我避免了后期的维护噩梦。例如文件IO、日志记录、跟踪等等...

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


1

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

如果你想要将记录器插入到你的类中以捕获所有内容 (class EventLogRecorder : IEventLog) ,你也可以这样做...并进行任何你需要的操作。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接