使用Moq模拟TraceListener

5
为什么Moq的Verify方法会失败并抛出"Moq.MockException : Invocation was not performed on the mock"异常?
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));
2个回答

6

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

当您通过TraceSource编写跟踪事件时,它会调用您的跟踪侦听器的TraceEvent方法进行跟踪 - 因此您需要验证对listener.TraceEvent的调用,而不是listener.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");

希望这能对某些人有所帮助!
祝好,
摩根

+1 - 很好的回答!与您的回答无关,您的量化代码非常受欢迎,并在许多许可下包含在许多其他库中。我能否找到您原始的Quantizer和OctreeQuantizer类的位置,以便我可以添加适当的引用和认可。谢谢! - Brandon Boone
Brandon - 谢谢!原始文章在 MSDN 上,http://msdn.microsoft.com/en-us/library/aa479306.aspx。其中包括源代码链接。随意链接回这篇文章,我已经不在微软工作了,但是链接回原始文章总比没有好! - Morgan Skinner
太好了!非常感谢您的参考和代码。这确实为我节省了大量时间。 - Brandon Boone

0
测试说明必须调用WriteLine方法,但未调用。查看代码,这很可能是因为此测试已经揭示了TraceSource.TraceEventTraceSource.Flush方法中的错误。仔细检查这些方法,然后你就可以开始了!
另外,请参见this question

如果我使用一个假的(对象),那么 WriteLine 方法会被调用。 - Lybecker
一个假的什么?你说的“假”是什么意思?请发一下我回答中提到的两种方法,或许我们可以从中看出些端倪。 - vidstige

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接