c#-Moq验证链接

提问

如果我有一个依赖项IObjectA,其中包含类型为IObjectB的PropertyA,则在IObjectB中具有公共方法Foo().

为了验证()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”得到正确的结果.是否可以查询objectA的属性以及用于调用的那些属性,即使它是模拟类型也可以吗?

最佳答案

为什么您认为B似乎更正确?

例子A说在对象A内部,检查PropertyA是否调用了foo.

在此示例中,对象A和对象B都没有捆绑在一起.因此,示例B在当前形式上似乎具有误导性,因为它试图表明存在某种关系.

现在,如果您使用安装程序将objectB分配给objectA,则两个示例都应该工作(因为您要告诉Moq对象A与对象B的关系).执行此设置将创建您要验证的关系.

类似于以下内容:

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

这基本上是说“当调用PropertyA时,将对象B还给我.”

评论