Moq验证不同方法的调用计数

时间:2018-06-21 16:03:14

标签: c# unit-testing moq

我正在尝试在C#单元测试中使用moq来验证模拟方法的调用计数。

SUT看起来像这样:

public void Run(){ Foo();}

private void Foo(){

  ClassToBeMocked.MethodToBeMocked();
  Bar();

}

private void Bar(){

  ClassToBeMocked.MethodToBeMocked();

}

测试看起来像这样:

_mockClass.Setup(x=>x.MethodToBeMocked()).Returns(value);

Run();

_mockClass.Verify(x=>x.MethodToBeMocked(), Times.Exactly(2));

但是我想要的是验证不同方法的调用次数,例如一次通过Foo()方法,一次通过Bar()方法。

有没有一种方法可以使用最小起订量来完成,还是需要使用反射?

2 个答案:

答案 0 :(得分:0)

实际上,有一种方法,尽管看起来有些混乱。您可以将moq的Callback方法与StackTrace一起使用:

_mockClass.Setup(x=>x.MethodToBeMocked().Returns(value)
.Callback(() => {
    var trace = new System.Diagnostics.StackTrace();
    var callerName = trace.GetFrame(5).GetMethod().Name;
    if (callerName == "Foo") CallFromFooMethod++;
    if (callerName == "Bar") CallFromBarMethod++;
});

答案 1 :(得分:0)

我认为这是不可能的。您可能可以模拟一个实现,该实现可以检查调用堆栈以跟踪字典中的调用位置。

通常,我认为您需要一个非常具体的理由来验证单元测试中的调用计数。单元测试的目的是验证在给定某些参数的情况下该方法是否可以返回预期结果。它不应该关注引擎盖下为实现该结果而发生的事情。为了使测试通过,需要特定的执行计数,以将您的单元测试与方法实现联系起来。开发人员应该能够修改方法的实现,以便在测试失败的情况下提供相同的结果。