Moq验证链接

Moq验证链接

问题描述:

如果我有一个依赖关系IObjectA其中包含PropertyA类型IObjectB具有公共方法Foo()IObjectBMoq验证链接

为了Verify() Foo()被调用可以完成这两个任务,这是正确的吗?

Mock<IObjectA> objectA = new Mock<IObjectA>(); 
Mock<IObjectB> objectB = new Mock<IObjectB>(); 

//A 
objectA.Verify(x => x.PropertyA.Foo()); 

//B 
objectA.Verify(x => x.PropertyA); 
objectB.Verify(x => x.Foo()); 

“B”似乎更正确,但不会验证和违背但是我调试“步”,“A”得到正确的结果。对象A可以被询问其属性和那些用于调用的属性,即使它是一个模拟类型?

为什么你认为B更正确?

示例A说内部对象检查PropertyA是否有foo调用它。

在这个例子中,objectA和objectB在任何情况下都没有绑定在一起。因此,例子B似乎误导了它的当前形式,因为它试图表明存在某种关系。

现在,如果您使用setup将objectB分配给objectA,那么这两个示例都应该有效(因为您正在告诉Moq objectA如何与objectB相关)。执行此设置会创建您正在验证的关系。

东西线沿线的:

objectA.Setup(x => x.PropertyA).Returns(objectB) 

这基本上说“当PropertyA被称为给我回对象B。”

+1

感谢,是从PropertyA返回对象B的伎俩。 objectA.Verify(x => x.PropertyA.Foo())也会验证Foo()调用,是否为假?有些人告诉我,x.PropertyA.Foo()是一个无效的调用,因为objectA的属性不能用于调用,这是正确的吗? – TheWolf 2012-02-28 03:00:31

+0

您对A的正确和正确。我道歉,我正在阅读和思考错误。我从测试的角度思考,即模拟如何处理理解的子调用,而不是来自具体实现的实际调用的视角。 – 2012-02-28 03:23:18