Moq验证链接
问题描述:
如果我有一个依赖关系IObjectA
其中包含PropertyA
类型IObjectB
具有公共方法Foo()
在IObjectB
。Moq验证链接
为了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。”
感谢,是从PropertyA返回对象B的伎俩。 objectA.Verify(x => x.PropertyA.Foo())也会验证Foo()调用,是否为假?有些人告诉我,x.PropertyA.Foo()是一个无效的调用,因为objectA的属性不能用于调用,这是正确的吗? – TheWolf 2012-02-28 03:00:31
您对A的正确和正确。我道歉,我正在阅读和思考错误。我从测试的角度思考,即模拟如何处理理解的子调用,而不是来自具体实现的实际调用的视角。 – 2012-02-28 03:23:18