0

我正在使用 Moq 在 VS2012 中编写我的第一个单元测试。

我需要创建一个接受多个输入参数的对象(并非所有参数都通过接口传递)。

为了示例,我已经最小化了代码。这是我正在尝试做的事情:

  var mockLoopControl = new Mock<LoopControl>();
  var LoopEngine = new LoopEngine(mockLoopControl.Object);

LoopControl对象很复杂,有很多在LoopEngine构造函数中使用的成员。

例如,LoopEngine构造函数执行的操作loopControl.ContextData又是一个具有很多成员的对象。

据我了解,我需要将数据分配给使用Mock.Setup(). 是否可以在应用程序运行时拍摄loopControl.ContextData对象的快照,然后在我的单元测试中使用它?

我可以弄清楚如何为如此复杂的架构编写单元测试。

我希望我说清楚:) 感谢您的帮助。

4

3 回答 3

3

你模拟它,所以你不需要创建那个复杂的结构。如果LoopEngine需要使用某些东西,LoopControl也许它做得太多了?也许它应该将它的一些工作委托给LoopControl其他对象?您可能应该提取一些其他对象并做其他事情。

因此,在我看来,您似乎正在尝试解决一些错误的问题。

如果您想测试更多功能,您可能会进行集成测试。然后你可能需要有更复杂的对象结构——对。但是您不一定需要使用模拟,而是在真实情况下检查结果。

于 2013-05-10T13:17:47.033 回答
1

据我了解您的问题,您不想模拟 的数百个属性LoopControl,对吗?看起来由于 和 之间的紧密耦合,您的单元测试变得LoopEngine越来越棘手。你有几个选项在这里LoopControlLoopEngine

  1. 坚持使用模拟(我更喜欢称之为替代,只是不要混淆模拟/假/存根术语)。
  2. 重构LoopEngine类构造函数以接受 ILoopControl 和LoopControl类以实现 ILoopControl。它会减轻很多嘲笑。
  3. 重构LoopControl其他方式,因为loopControl.ContextData对我来说听起来不太好(模型和控制器的可能混合或像这样的smth)。通过查看您的LoopControl类及其目标,您可能会提取一些其他类,它恰好包含初始化所需的内容LoopEngine(更高的凝聚力总是一个加号)。
  4. 不要为任何重构和单元测试以及对LoopEngineandLoopControl对进行一些集成测试而烦恼(但任何错误都需要更多的调查工作)。
于 2013-05-10T13:30:25.083 回答
0

以这种方式处理单元测试的一种常见方法是简单地创建一个假的替代对象,该对象呈现您正在测试的类以及您希望它呈现的数据以便对其进行测试。您可以隔离您正在测试的类并使用已知值对其进行测试。

为您的测试编写“替代”的快速静态类应该相对简单。

于 2013-05-10T13:12:42.600 回答