Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试-如何快照对象?_C#_Unit Testing_Moq - Fatal编程技术网

C# 单元测试-如何快照对象?

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=新的

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

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

为了这个例子,我已经最小化了代码。以下是我想做的:

  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
的单元测试似乎变得越来越棘手。你有几个选择

  • 继续使用mock(我更喜欢称之为替换,只是不要弄乱mock/fake/stub术语)
  • 重构
    LoopEngine
    类构造函数以接受ILoopControl,重构
    LoopControl
    类以实现ILoopControl。这将大大缓解嘲笑
  • 重构
    LoopControl
    其他方法,因为
    LoopControl.ContextData
    听起来不太适合我(可能是模型和控制器的混合,或者类似的smth)。通过查看
    LoopControl
    类及其目标,您可能会提取出另一个类,该类正好包含
    LoopEngine
    初始化所需的内容(较高的内聚度总是一个加号)
  • 不要费心任何重构和单元测试,也不要对
    LoopEngine
    LoopControl
    对进行集成测试(但任何错误都需要更多的调查工作)

  • 据我所知,您不想模拟
    LoopControl
    的数百个属性,对吗? 由于
    LoopControl
    LoopEngine
    之间的紧密耦合,您对
    LoopEngine
    的单元测试似乎变得越来越棘手。你有几个选择

  • 继续使用mock(我更喜欢称之为替换,只是不要弄乱mock/fake/stub术语)
  • 重构
    LoopEngine
    类构造函数以接受ILoopControl,重构
    LoopControl
    类以实现ILoopControl。这将大大缓解嘲笑
  • 重构
    LoopControl
    其他方法,因为
    LoopControl.ContextData
    听起来不太适合我(可能是模型和控制器的混合,或者类似的smth)。通过查看
    LoopControl
    类及其目标,您可能会提取出另一个类,该类正好包含
    LoopEngine
    初始化所需的内容(较高的内聚度总是一个加号)
  • 不要费心任何重构和单元测试,也不要对
    LoopEngine
    LoopControl
    对进行集成测试(但任何错误都需要更多的调查工作)