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

C# 模拟事件日志和事件日志条目,c#,windows,unit-testing,mocking,event-log,C#,Windows,Unit Testing,Mocking,Event Log,我正在尝试为报告事件日志中条目的应用程序编写单元测试。现在,当我运行单元测试时,我必须创建一个临时事件日志,向其中写入条目,并在完成后删除日志。我这样做是因为我需要返回EventLogEntry对象,它没有构造函数 我的问题是,有没有办法模仿事件日志来获取事件日志条目。在我看来,必须将条目写入实际的事件日志更像是集成测试,而不是单元测试 这更像是一个集成测试,这是正确的。然而,你需要问问自己,你到底想在这里测试什么。如果它确实是一个单元测试,并且您只想在EventLogEntries上测试逻辑,

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


我的问题是,有没有办法模仿事件日志来获取事件日志条目。在我看来,必须将条目写入实际的事件日志更像是集成测试,而不是单元测试

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

TDD让我走上了一条孤立和嘲弄很多让我觉得很奇怪的事情的道路,但最终让我从以后的维护噩梦中解脱出来。i、 文件IO、日志记录、跟踪等


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

< P>这是界面非常有用的地方。让您的类依赖IEventLog而不是EventLog。然后,在测试中,您可以模拟IEventLog并验证您期望在IEventLog上调用的方法是否确实被调用

如果您想在类中插入记录器以捕获所有内容(
classeventlogrecorder:IEventLog
),您也可以这样做。。。做你想做的事


松耦合是您想要达到的目的…

这类似于我今天刚刚回答的另一个问题-

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

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

interface Logger
{
  void WriteEvent(Event e);
  void IEnumerable<Event> GetEvents();
}
现在我们需要的只是测试。。。像UIA或123一样简单

  • 依赖于记录器的类的单元测试将使用模拟
  • 编写集成测试以验证EventLogAdapter的API是否确实从Windows事件日志中写入内容和读取内容
  • 至少编写一个验收测试,以验证导致某些日志记录的端到端方案,即验证EventLogAdapter是否正确插入
public EventLogAdapter : Logger {
 //delegates to .Net framework's EventLog  
 // Also EventLogEntry is internal to this class - entries will be mapped to Event structs
}