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
Unit testing 在测试对象中模拟事件的策略_Unit Testing_Mstest - Fatal编程技术网

Unit testing 在测试对象中模拟事件的策略

Unit testing 在测试对象中模拟事件的策略,unit-testing,mstest,Unit Testing,Mstest,全新的单元测试,我的意思是真正的新。我已经读了很多书,而且进展缓慢,在前进的过程中努力遵循最佳实践。我正在VisualStudio2010中使用MS测试 我遇到了一个要求,我不太确定如何继续下去。我正在开发一个负责与外部硬件交互的组件。这个项目上还有几个开发人员,他们没有访问硬件的权限,所以我已经实现了组件的“虚拟”或模拟实现,并将尽可能多的共享逻辑移到基类中 现在,就允许他们编译和运行代码而言,这很好,但对于模拟单元测试所需的事件和内部状态更改来说,这并不十分有用(别忘了,我是测试新手) 例如

全新的单元测试,我的意思是真正的新。我已经读了很多书,而且进展缓慢,在前进的过程中努力遵循最佳实践。我正在VisualStudio2010中使用MS测试

我遇到了一个要求,我不太确定如何继续下去。我正在开发一个负责与外部硬件交互的组件。这个项目上还有几个开发人员,他们没有访问硬件的权限,所以我已经实现了组件的“虚拟”或模拟实现,并将尽可能多的共享逻辑移到基类中

现在,就允许他们编译和运行代码而言,这很好,但对于模拟单元测试所需的事件和内部状态更改来说,这并不十分有用(别忘了,我是测试新手)

例如,我想测试组件上的几个事件,但是我需要调用它们来测试它们。通常,要引发事件,我会按下硬件上的按钮或分流两个端子,但在模拟对象中(显然),我不能这样做

我有两个顾虑/要求:

  • 我需要为我的单元测试提供状态更改和引发事件
  • 我需要为我的团队提供状态更改和引发事件,以测试组件的依赖性(例如,当某个硬件事件发生时,WPF视图上的按钮变为启用)
  • 对于后者,我考虑了一些复杂的控制面板对话框,它可以让我触发事件,并通常模拟硬件操作和用户交互。这很复杂,因为它需要一个没有消息泵的组件来提供一个带有控件的窗口。发恶臭的。或者另一种方法是实现模拟组件,以获取一个“StateInfo”对象,我可以使用它来更改对象的内部结构


    这不可能是一个新问题,我相信你们中的许多人都做过类似的事情,我只是想知道你们用了什么模式或策略来实现这一点。我知道我可以使用n访问器访问私有字段,但这并不能真正提供交互式(在运行时模拟的情况下)更改。

    如果库中有一个用于与外部硬件交互的接口,您可以为它创建一个模拟对象,并在单元测试中从中引发事件

    如果没有,那么您需要将硬件调用封装在包装器类中,以便模拟它并在测试中提供所需的行为

    有关如何从模拟对象引发事件的示例,请查看


    我希望这有帮助

    听起来好像“模拟对象”就是我一直以来所说的“虚拟对象”;)现在的难题是如何设计对象以避免实际实现和模拟对象中的大量代码重复。换句话说,如果引发事件的系统很复杂,我需要在模拟对象中复制它以进行测试。这当然会造成维护问题。我想将尽可能多的功能转移到基类中会有所帮助,但似乎仍然会有大量的重复。我写了一篇很长的评论,谈到我是如何仍然感到困惑的,但最后我有了我的“哈哈时刻”。您的语句:“…您需要将硬件调用包装在包装器类中,以便模拟它…”是关键。告诉我这个是否正确:1。为硬件SDK包装器对象(例如IHardware)2创建接口。对我要测试的对象进行更改,以便以某种方式注入IHardware实例(目前它没有使用任何DI)3。创建IHardware的模拟实现,该实现公开状态属性和方法以设置内部状态4。(下一条评论)4。找到一些方法让单元测试注入模拟对象,而不是实际的对象5。调用模拟对象上的方法并设置属性以模拟我的硬件事件。。。为了测试一些东西,这需要付出很多额外的努力。虽然如果这确实是适合这种情况的策略,那么我将从中学习,并在下次开始使用它。那么我所有这些都正确吗?你的步骤基本上是正确的,是的,这是一个小的工作,但它不是太难。只需从包含实际需要调用的方法的接口开始,然后逐步构建它。