【问题标题】:Mocking virtual members in Moq在 Moq 中模拟虚拟成员
【发布时间】:2012-07-09 08:04:07
【问题描述】:

对于单元测试,我使用的是 NUnit 2.6 和 Moq 4.0。有一个关于虚拟成员的特殊情况,其中 Moq 的代理对象不将方法调用中继到实际实现(可能是设计使然)。例如,如果我有一堂课……

public class MyClass {
    protected virtual void A() {
        /* ... */
    }

    protected virtual void B(...) {
        /* ... */
    }
}

...我使用 Moq 在我的测试夹具中覆盖 GetSomethingElseA() 方法...

var mock = new Mock<MyClass>();
mock.Protected().Setup("A").Callback(SomeSortOfCallback);

...使用模拟的A 方法效果很好;但是,如果所述方法中的任何内容将调用非模拟方法 B,则该方法将不执行任何操作和/或返回默认值,即使 MyClass 中存在实际实现也是如此。

有没有办法解决这个问题?我是不是用错了起订量?

提前致谢,
曼尼

【问题讨论】:

    标签: c# moq


    【解决方案1】:

    设置mock.CallBase = true,你应该很高兴。

    【讨论】:

    • 如果还想mock其他方法怎么办?
    • @LouisRhys 很确定这不会干扰它 - 如果你明确地模拟某些东西,CallBase 设置永远不会发挥作用。
    【解决方案2】:
     var systemUnderTest = new Moq.Mock<ProcessBulkData> { CallBase = true };
     systemUnderTest.Setup(s => s.MethodName(...)).Returns(...);
     var actual=systemUnderTest.Object.BulkInsert(...);
    

    【讨论】:

    • 最好在你的答案中包含一些代码解释。
    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 2010-11-30
    • 1970-01-01
    • 2011-07-18
    • 2012-09-27
    • 1970-01-01
    • 2017-03-29
    • 2010-12-21
    相关资源
    最近更新 更多