使用MOQ验证自己调用哪个方法?

时间:2014-10-21 14:02:30

标签: c# unit-testing moq

我测试的对象将根据某些内容调用其他方法。

class ToTest {
 public void A(MyObject o) {
  if (some_condition)
   this.B(o);
  else 
   this.C(o);
 }
 public void B(MyObject o) { ... }
 public void C(MyObject o) { ... }
}

如何验证方法B()是否被调用?

2 个答案:

答案 0 :(得分:2)

你不能。您可以验证是否已在模拟对象上调用方法,但是不可能拥有对象moq。

如果MyObject确实是一个模拟对象,你可以使用:

mockObject.Verify(m => m.B(It.IsAny<Type>()), Times.Exacly(n))

答案 1 :(得分:2)

如果BC不是虚拟的,那么您将无法使用Moq直接验证这些方法,因为它们与A紧密耦合

然而,您可以间接验证分支,例如如果BC对对象o做了不同的事情,那么您可以检测到这一点,或者BC自己调用Mockable依赖项,例如如果B调用ILoggerC调用ORM更新,则可以通过间接交互的存在间接验证分支。

否则,我会建议代码重构:

  • 制作B和C virtual,以便Moq可以验证它们(可能带有CallBase=true,如果与SUT上的测试相关)
  • 如果B和C表示不同的关注点(在SOLID意义上),则考虑其他重构,以便将方法BC本身重新定位到可模拟的依赖关系。