使用Moq模拟TraceListener

Lyb*_*ker 4 c# trace system.diagnostics moq mocking

为什么Moq Verify失败并出现"Moq.MockException:未在模拟上执行调用"?

var mock = new Mock<TraceListener>();
var ts = new TraceSource("traceSourceName", SourceLevels.Verbose);
ts.Listeners.Add(mock.Object);

var message = "the message";

ts.TraceEvent(TraceEventType.Verbose, 0, message);
ts.Flush();
mock.Verify(x => x.WriteLine(message));
Run Code Online (Sandbox Code Playgroud)

Mor*_*ner 5

我知道这个问题已经存在很久了,但答案如下......

当您通过TraceSource编写跟踪事件时,它会调用跟踪侦听器TraceEvent方法来执行跟踪 - 因此您需要验证对listener.TraceEvent的调用,而不是侦听器.WriteLine ...

var mock = new Mock<TraceListener>();
var ts = new TraceSource("traceSourceName", SourceLevels.Verbose);
ts.Listeners.Add(mock.Object);

var message = "the message";

ts.TraceEvent(TraceEventType.Verbose, 0, message);

mock.Verify(x => x.TraceEvent(It.IsAny<TraceEventCache>(), "traceSourceName", 
    TraceEventType.Verbose, 0, message), Times.Once(), "Expected a trace");
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人!

干杯,

摩根