模拟(Moq)对象列表 - 最佳实践/简化
-
07-07-2019 - |
题
请考虑以下事项:
new SUT(null, null, new List<IObjectBeingMocked>() { mockObjectOne.Object, mockObjectTwo.Object })
我的SUT(被测系统)需要一个对象列表作为第三个参数。这些都需要嘲笑,因为我已经对这些做了一些预期。
如何清除它以便我可以不再需要在列表中的每个项目上调用 .Object
?通常只有两个项目,但这可能会增长,在我看来,这使得测试更难阅读。
将这个模拟对象列表轻松/好地转换为实际对象的最佳方法是什么?
解决方案
您可以使用Mocks.Query()方法,该方法将返回所有模拟SUT实例的集合 此功能存在于moq的beta版本中。详情请见此处:
其他提示
也许您可以使用扩展方法来管理列表创建和Object属性的调用。
var list = new List<Mock<Foo>>() { ... };
new SUT( null, null, list.Select( o => o.Object ).ToList() );
处理此问题的一种好方法是创建一个GetSUT()方法,该方法仅在一个位置创建一次。然后,当您的SUT创建发生变化时,您只需在一个地方进行更改。
为清晰起见,您可以介绍解释变量(当地人):
IObjectBeingMocked objectOne = mockObjectOne.Object;
IObjectBeingMocked objectTwo = mockObjectTwo.Object;
new SUT(null, null, new List<IObjectBeingMocked>() { objectOne, objectTwo });
编辑:可能选择的名称比我的“objectOne”,“objectTwo”更好。 ;) 不隶属于 StackOverflow