我测试的对象将根据某些内容调用其他方法。
即
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()是否被调用?
答案 0 :(得分:2)
你不能。您可以验证是否已在模拟对象上调用方法,但是不可能拥有对象moq。
如果MyObject确实是一个模拟对象,你可以使用:
mockObject.Verify(m => m.B(It.IsAny<Type>()), Times.Exacly(n))
答案 1 :(得分:2)
如果B
和C
不是虚拟的,那么您将无法使用Moq直接验证这些方法,因为它们与A
紧密耦合
然而,您可以间接验证分支,例如如果B
和C
对对象o
做了不同的事情,那么您可以检测到这一点,或者B
和C
自己调用Mockable依赖项,例如如果B
调用ILogger
而C
调用ORM更新,则可以通过间接交互的存在间接验证分支。
否则,我会建议代码重构:
virtual
,以便Moq可以验证它们(可能带有CallBase=true
,如果与SUT上的测试相关)SOLID
意义上),则考虑其他重构,以便将方法B
和C
本身重新定位到可模拟的依赖关系。