如何使用Moq库创建SerialPort模拟?

我必须写很多处理串口的代码。 通常会在电线的另一端连接一个设备,我通常会创建自己的模拟来模拟它们的行为。

我开始关注Moq以帮助进行unit testing。 当你只需要一个存根时,使用它非常简单,但我想知道它是否可行,如果是,我如何为硬件设备创建一个模拟器,根据我想测试的内容做出不同的响应。

一个简单的例子:

我与之接口的设备之一接收命令(移动到位置x),返回ACK消息并进入“移动”状态,直到它到达有序位置。

我想创建一个测试,我发送移动命令,然后继续查询状态,直到它到达最终位置。

我想为两个不同的测试创建两个版本的模拟,一个是我希望设备成功到达最终位置,另一个是失败。

要问的问题太多了?

如果您的程序中有串行端口对象的接口,那么Moq可以通过创建模拟串行端口对象来实现这一点(Moq适用于任何复杂的存根和模拟)。

如果您希望在到达硬件之前拦截对BCL SerialPort类的调用(无需创建串行端口接口和实现,再加上测试实现),那么您需要更强大的function。 这就是Moles的用途。

如果你想真正模拟一个设备,那么这超出了“unit testing”。 在此级别,可以使用com0com添加一对虚拟串行端口,并为您的设备编写可与之交谈的模拟器。 在这个级别,自动化测试要复杂得多(尽管不是不可能)。

如果您使用模拟进行TDDing,那么您应该让测试定义您的对象。 在您编写任何测试之前,听起来您已经有了设计。

您的初步设计包括:

  • 命令发件人
  • 命令接收器
  • 轮询(异步/同步)
  • 根据推论,您必须具有Timeoutfunction

这已经是您的SerialController必须实现的职责。 哇,没有任何测试就可以实现很多。

开始很好,很容易。

尝试并尝试“最后负责任的时刻”的想法。

那么你要使用的语法呢?

您可能想要检查一下: 如何测试 – 我自己的小型嵌入式操作系统的可靠性

我给出了Atomic Object的硬件方式和James Greening Blog的链接。 詹姆斯有一些关于用硬件做TDD的好文章(不介意ruby,c和c ++的东西。如果你做硬件那么你之前用过c和c ++;))。

顺便说一下,你的表现看起来非常令人兴奋。