验证使用Moq调用受保护方法的次数

时间:2010-09-16 16:51:24

标签: .net unit-testing mocking moq

在我的单元测试中,我正在使用Moq模拟一个受保护的方法,并且想断言它被调用了一定次数。 This question描述了早期版本的Moq的类似内容:

//expect that ChildMethod1() will be called once. (it's protected)
testBaseMock.Protected().Expect("ChildMethod1")
  .AtMostOnce()
  .Verifiable();

...
testBase.Verify();

但这不再有效;从那时起语法发生了变化,我无法使用Moq 4.x找到新的等价物:

testBaseMock.Protected().Setup("ChildMethod1")
  // no AtMostOnce() or related method anymore
  .Verifiable();

...
testBase.Verify();

2 个答案:

答案 0 :(得分:23)

Moq.Protected命名空间中,有一个IProtectedMock接口,其中有一个将Times作为参数的Verify方法。

修改 至少从Moq 4.0.10827开始提供此功能。语法示例:

testBaseMock.Protected().Setup("ChildMethod1");

...
testBaseMock.Protected().Verify("ChildMethod1", Times.Once());

答案 1 :(得分:9)

为了增加Ogata的答案,我们还可以验证带参数的受保护方法

testBaseMock.Protected().Setup(
    "ChildMethod1",
    ItExpr.IsAny<string>(),
    ItExpr.IsAny<string>());

testBaseMock.Protected().Verify(
    "ChildMethod1", 
    Times.Once(),
    ItExpr.IsAny<string>()
    ItExpr.IsAny<string>());

例如,这将验证ChildMethod1(string x, string y)

另请参阅:http://www.nudoq.org/#!/Packages/Moq.Testeroids/Moq/IProtectedMock(TMock)/M/Verify