我正在为 Enterprise Library Logging 编写一个适配器,根据我们的编码标准,需要一种单元测试方法。
接口和实现很简单,但我需要一种方法来检查是否已使用日志条目上的某些参数调用了 Logger.Write。不幸的是,Logger.Writer 没有设置器,我也没有任何工具来模拟静态类。
例如,我希望能够在调用适配器方法时断言底层编写器的事件 ID 或严重性。
我正在为 Enterprise Library Logging 编写一个适配器,根据我们的编码标准,需要一种单元测试方法。
接口和实现很简单,但我需要一种方法来检查是否已使用日志条目上的某些参数调用了 Logger.Write。不幸的是,Logger.Writer 没有设置器,我也没有任何工具来模拟静态类。
例如,我希望能够在调用适配器方法时断言底层编写器的事件 ID 或严重性。
您可以实现自定义跟踪侦听器,并将其用作单元测试跟踪侦听器:
[ConfigurationElementType(typeof(CustomTraceListenerData))]
public class StubTraceListener : CustomTraceListener
{
private readonly static List<LogEntry> logEntries_ =
new List<LogEntry>();
private readonly static List<string> logMessages_ =
new List<string>();
public override void Write(string message)
{
StubTraceListener.logMessages_.Add(message);
}
public override void WriteLine(string message)
{
StubTraceListener.logMessages_.Add(message);
}
public override void TraceData(TraceEventCache eventCache,
string source, TraceEventType eventType, int id,
object data)
{
LogEntry le = data as LogEntry;
if (le != null)
{
StubTraceListener.logEntries_.Add(le);
if (this.Formatter != null)
{
this.Write(this.Formatter.Format(le));
return;
}
}
base.TraceData(eventCache, source, eventType, id, data);
}
internal static IList<string> GetLogMessages()
{
return new ReadOnlyCollection<string>
(StubTraceListener.logMessages_);
}
internal static IList<LogEntry> GetLogEntries()
{
return new ReadOnlyCollection<LogEntry>
(StubTraceListener.logEntries_);
}
internal static void Reset()
{
StubTraceListener.logEntries_.Clear();
StubTraceListener.logMessages_.Clear();
}
}
然后,在测试项目的 App.config 文件中包含跟踪侦听器,如下所示:
<listeners>
<add listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.CustomTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0,Culture=neutral"
type="Path.To.Your.Project.Folder.StubTraceListener, Your.Test.Project.Name" name="MockTraceListener" />
</listeners>
然后,您可以像往常一样轻松创建编写器:
Logger.SetLogWriter(new LogWriterFactory().Create(), false);