我正在使用Moq在VS2012中编写我的第一个单元测试。
我需要创建一个接受多个输入参数的对象(并非所有参数都通过接口传递)。
为了示例,我已经将代码最小化了。这就是我想要做的事情:
var mockLoopControl = new Mock<LoopControl>();
var LoopEngine = new LoopEngine(mockLoopControl.Object);
LoopControl
对象很复杂,在LoopEngine
构造函数中使用了很多成员。
例如,LoopEngine
构造函数使用loopControl.ContextData
执行操作,Mock.Setup()
也是具有大量成员的对象。
根据我的理解,我需要将数据分配给使用loopControl.ContextData
使用的成员。是否可以在应用程序运行时获取{{1}}对象的快照,然后在我的单元测试中使用它?
我可以弄清楚如何为这种复杂的架构编写单元测试。
我希望自己清楚明白:)感谢您的帮助。
丹
答案 0 :(得分:3)
你嘲笑它,所以你不需要创建那么复杂的结构。如果LoopEngine
需要使用来自LoopControl
的内容,那么它可能会做多少事情?也许它应该将其部分工作委托给LoopControl
或其他对象?您应该提取一些其他对象并执行其他操作。
所以在我看来,你正试图在这里解决一些错误的问题。
如果您想测试更多功能,您可能正在进行集成测试。那么你可能需要有更复杂的对象结构 - 对。但是你不一定需要使用模拟,而是检查实际结果中的结果。
答案 1 :(得分:1)
据我了解你的问题,你不想模仿LoopControl
的数百个属性,对吧?
由于LoopEngine
和LoopControl
之间的紧密耦合,您LoopEngine
的单元测试看起来很棘手。你有几个选择
LoopEngine
类构造函数以接受ILoopControl和LoopControl
类来实现ILoopControl。它可以轻松嘲笑。LoopControl
其他方式,'因为loopControl.ContextData
对我来说听起来不太好(模型和控制器的混合或像这样的smth)。通过查看您的LoopControl
类及其目标,您可能会提取一些其他类,它完全包含LoopEngine
初始化所需的内容(更高的内容总是一个加号)。LoopEngine
和LoopControl
对进行一些集成测试(但任何错误都需要更多的调查工作)。答案 2 :(得分:0)
以这种方式进行手线单元测试的一种常见方法是简单地创建一个伪替换对象,该对象使用您希望它呈现的数据来呈现您正在测试的类,以便对其进行测试。您可以隔离正在测试的类并使用已知值对其进行测试。
编写快速静态类应该相对简单,这些静态类是您的测试的“替身”。