Moq验证链接

本文关键字:链接 验证 Moq | 更新日期: 2023-09-27 18:25:56

如果我有一个依赖IObjectA,它包含类型为IObjectBPropertyA,在IObjectB中有一个公共方法Foo()

为了调用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是否可以被询问其属性以及用于调用的那些属性,即使它是一个模拟类型?

Moq验证链接

为什么你认为B看起来更正确?

示例A在对象A内部表示检查PropertyA是否调用了foo

在本例中,对象A和对象B无论如何都没有绑定在一起。因此,以目前的形式来看,例子B似乎具有误导性,因为它试图表明存在某种关系。

现在,如果您使用setup将对象B分配给对象A,那么这两个例子都应该有效(因为您正在告诉Moq对象A与对象B的关系)。执行此设置将创建要验证的关系。

大致如下:

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

这基本上是说"当PropertyA被调用时,将对象B还给我。"