我正在为一个组件编写单元测试,该组件利用对Windows事件日志的读写功能,如果我的目标是移除外部依赖项(读取和写入实际事件日志),我很难了解如何最好地模拟这个问题。
该组件使用EventLogWatcher订阅事件,以便在将特定事件发布到事件日志时引发事件EventRecordWritten,而我的ReadEventLog()委托函数处理与新发布事件相关的逻辑。
在这个单元测试中,我的目标是最终测试ReadEventLog()的功能,但我不知道如何亲自引发EventRecordWritten事件,以便调用ReadEventLog()。
我正在寻找关于如何正确地为事件日志编写单元测试的任何建议,这样我就不会真正地写入事件日志,而是仍然以某种方式使用我现有的ReadEventLog()委托函数(因为这是我需要测试的逻辑)。
发布于 2022-04-06 13:40:48
由于EventLogWatcher不实现接口(IDisposable除外),所以您应该在它周围声明一个包装类,该类实现IEventLogWatcher成员和事件:
public interface IEventLogWatcher
{
bool Enabled { get; set; }
event EventHandler<EventRecordWrittenEventArgs> EventRecordWritten;
}
public class EventLogWatcherWrapper : IEventLogWatcher
{
private EventLogWatcher eventLogWatcher { get; set; }
public bool Enabled
{
get => eventLogWatcher.Enabled;
set => eventLogWatcher.Enabled = value;
}
public EventLogWatcherWrapper(string path)
{
eventLogWatcher = new EventLogWatcher(path);
}
public EventLogWatcherWrapper(EventLogQuery eventQuery, EventBookmark bookmark)
{
eventLogWatcher = new EventLogWatcher(eventQuery, bookmark);
}
public EventLogWatcherWrapper(EventLogQuery eventQuery, EventBookmark bookmark, bool readExistingEvents)
{
eventLogWatcher = new EventLogWatcher(eventQuery, bookmark, readExistingEvents);
}
event EventHandler<EventRecordWrittenEventArgs> IEventLogWatcher.EventRecordWritten
{
add { eventLogWatcher.EventRecordWritten += value; }
remove { eventLogWatcher.EventRecordWritten -= value; }
}
}现在,您可以在类中将EventLogWatcher属性定义为IEventLogWatcher,并在单元测试时传递mockEventLogWatcher对象。
https://stackoverflow.com/questions/71767359
复制相似问题