我正在尝试为一个报告EventLog中条目的应用程序编写单元测试。现在,当我运行单元测试时,我必须创建一个临时EventLog,向其中写入条目,并在完成后删除日志。我这样做是因为我需要取回EventLogEntry对象,该对象没有构造函数。
我的问题是,有没有办法通过模拟EventLog来恢复EventLogEntries。在我看来,必须向实际的EventLog中写入条目更像是集成测试,而不是单元测试。
发布于 2010-07-31 03:40:38
您说得对,这更像是一次集成测试。然而,您需要问问自己,您在这里真正想要测试的是什么。如果它真的是一个单元测试,并且您只想在EventLogEntries上测试逻辑,那么您应该像对待任何其他外部依赖项一样对待事件日志。
TDD让我走上了隔离和嘲笑许多让人觉得奇怪的东西的道路,但最终却把我从维护的噩梦中拯救出来。即文件IO、日志记录、跟踪等...
我会将所有CRUD操作都粘贴到接口边界后面的事件日志中,并将其视为数据访问。如果您不能轻松地在带外创建EventLogEntries,那么您甚至可以考虑创建您自己的实体来表示事件日志中的条目并使用它们。
发布于 2010-08-02 02:07:06
这类似于我今天刚刚回答的另一个问题-- 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一样简单
依赖于记录器的类的
发布于 2010-07-31 03:56:49
这就是接口真正有用的地方。让你的类依赖于IEventLog而不是EventLog。然后,在您的测试中,您可以模拟IEventLog,并验证您期望在IEventLog上调用的方法确实得到了调用。
如果你想在你的类中插入一个记录器来捕获所有东西(class EventLogRecorder : IEventLog),你也可以这样做……做任何你需要做的事。
松散耦合是你想要达到的目标……
https://stackoverflow.com/questions/3372940
复制相似问题