【问题标题】:Mocking a TraceListener with Moq使用 Moq 模拟 TraceListener
【发布时间】:2011-06-13 18:39:22
【问题描述】:

为什么 Moq 验证失败并显示“Moq.MockException : Invocation was not executed 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));

【问题讨论】:

    标签: c# mocking moq trace system.diagnostics


    【解决方案1】:

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

    当您通过 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 - 不错的答案!与您的答案无关,your quantization code 非常受欢迎,并包含在许多其他库中,并获得了许多许可。有没有地方可以找到你原来的 Quantizer 和 OctreeQuantizer 类,这样我就可以添加适当的参考和识别。谢谢!
    • 布兰登 - 谢谢!原文在 MSDN 上,msdn.microsoft.com/en-us/library/aa479306.aspx。这包括指向源代码的链接。随意链接回这篇文章,我不再为 Microsoft 工作,但返回原始链接总比没有好!
    • 太棒了!非常感谢您的参考和代码。这无疑为我节省了大量时间。
    【解决方案2】:

    测试表明必须调用WriteLine 方法,但事实并非如此。查看代码很可能是因为此测试暴露了您的 TraceSource.TraceEventTraceSource.Flush 方法中的错误。仔细检查这些方法,您应该一切顺利!

    另外,请参阅this question

    【讨论】:

    • 如果我使用的是假的,就会调用WriteLine方法。
    • 假的什么?你说的假货是什么意思?把我回答中提到的两个方法贴出来,或许我们能从中看出点什么。
    猜你喜欢
    • 2019-09-11
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多