模拟被测对象中事件的策略

时间:2011-08-12 20:12:30

标签: unit-testing mstest

全新的单元测试,我的意思是真的很新。我已经阅读了很多,而且我正在慢慢地移动,试图遵循最佳实践。我在Visual Studio 2010中使用MS-Test。

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

现在这可以很好地允许它们编译和运行代码,但它对于模拟单元测试所需的事件和内部状态更改并不是很有用(不要忘记我是新手测试)< / p>

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

我有两个问题/要求:

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

    这不是一个新问题,我相信很多人不得不做类似的事情,我只是想知道你用来实现这个目的的模式或策略。我知道我可以使用n访问器访问私有字段,但这实际上并没有提供交互式(在运行时模拟的情况下)更改。

1 个答案:

答案 0 :(得分:2)

如果库中有一个用于与外部硬件交互的接口,您只需为其创建一个模拟对象,并从单元测试中提取事件。

如果没有,那么你需要将硬件调用包装在一个包装类中,这样你就可以模拟它并在测试中提供你想要的行为。

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

我希望有所帮助!