C# 单元测试-如何快照对象?
我正在使用Moq编写VS2012中的第一个单元测试 我需要创建一个接受多个输入参数的对象(并非所有参数都通过接口传递) 为了这个例子,我已经最小化了代码。以下是我想做的:C# 单元测试-如何快照对象?,c#,unit-testing,moq,C#,Unit Testing,Moq,我正在使用Moq编写VS2012中的第一个单元测试 我需要创建一个接受多个输入参数的对象(并非所有参数都通过接口传递) 为了这个例子,我已经最小化了代码。以下是我想做的: var mockLoopControl = new Mock<LoopControl>(); var LoopEngine = new LoopEngine(mockLoopControl.Object); var mockLoopControl=new Mock(); var LoopEngine=新的
var mockLoopControl = new Mock<LoopControl>();
var LoopEngine = new LoopEngine(mockLoopControl.Object);
var mockLoopControl=new Mock();
var LoopEngine=新的LoopEngine(mockLoopControl.Object);
LoopControl
对象很复杂,有许多成员,这些成员在LoopEngine
构造函数中使用
例如,LoopEngine
构造函数使用loopControl.ContextData
执行操作,这也是一个包含大量成员的对象
据我所知,我需要将数据分配给使用Mock.Setup()
的成员。是否可以在应用程序运行时获取loopControl.ContextData
对象的快照,然后在我的单元测试中使用它
我可以想出如何为如此复杂的体系结构编写单元测试
我希望我说清楚:)谢谢你的帮助
Dan以这种方式进行手持单元测试的一种常见方法是简单地创建一个伪替代对象,该对象使用您希望显示的数据显示您正在测试的类,以便对其进行测试。然后,您可以隔离正在测试的类,并使用已知值对其进行测试
编写用于测试的“替代”快速静态类应该相对简单 以这种方式进行手持单元测试的一种常见方法是简单地创建一个伪替代对象,该对象使用您想要的数据来表示您正在测试的类,以便对其进行测试。然后,您可以隔离正在测试的类,并使用已知值对其进行测试
编写用于测试的“替代”快速静态类应该相对简单 您可以模拟它,这样就不需要创建复杂的结构。如果
LoopEngine
需要使用LoopControl
中的某些东西,那么它可能做得太多了?也许它应该将部分工作委托给LoopControl
或其他对象?您可能应该提取一些其他对象并执行其他操作
所以在我看来,你们试图解决一点错误的问题
如果您想测试更多的功能,您可能需要进行集成测试。然后你可能需要有更复杂的对象结构-对。但是你不一定需要使用模拟,而是在真实情况下检查结果。你模拟它,所以你不需要创建复杂的结构。如果
LoopEngine
需要使用LoopControl
中的某些东西,那么它可能做得太多了?也许它应该将部分工作委托给LoopControl
或其他对象?您可能应该提取一些其他对象并执行其他操作
所以在我看来,你们试图解决一点错误的问题
如果您想测试更多的功能,您可能需要进行集成测试。然后你可能需要有更复杂的对象结构-对。但是你不一定需要使用mock,而是在实际情况下检查结果。据我所知,你不想模拟
LoopControl
的数百个属性,对吗?
由于LoopControl
和LoopEngine
之间的紧密耦合,您对LoopEngine
的单元测试似乎变得越来越棘手。你有几个选择
LoopEngine
类构造函数以接受ILoopControl,重构LoopControl
类以实现ILoopControl。这将大大缓解嘲笑LoopControl
其他方法,因为LoopControl.ContextData
听起来不太适合我(可能是模型和控制器的混合,或者类似的smth)。通过查看LoopControl
类及其目标,您可能会提取出另一个类,该类正好包含LoopEngine
初始化所需的内容(较高的内聚度总是一个加号)LoopEngine
和LoopControl
对进行集成测试(但任何错误都需要更多的调查工作)据我所知,您不想模拟
LoopControl
的数百个属性,对吗?
由于LoopControl
和LoopEngine
之间的紧密耦合,您对LoopEngine
的单元测试似乎变得越来越棘手。你有几个选择
LoopEngine
类构造函数以接受ILoopControl,重构LoopControl
类以实现ILoopControl。这将大大缓解嘲笑LoopControl
其他方法,因为LoopControl.ContextData
听起来不太适合我(可能是模型和控制器的混合,或者类似的smth)。通过查看LoopControl
类及其目标,您可能会提取出另一个类,该类正好包含LoopEngine
初始化所需的内容(较高的内聚度总是一个加号)LoopEngine
和LoopControl
对进行集成测试(但任何错误都需要更多的调查工作)