我必须写很多处理串口的代码。通常会在电线的另一端连接一个设备,我通常会创建自己的模拟来模拟它们的行为。
我开始关注Moq以帮助进行单元测试。当你只需要一个存根时,使用它非常简单,但我想知道它是否可行,如果是,我如何根据我想要测试的内容为硬件设备创建一个模拟器。
一个简单的例子:
我接口的一个设备接收命令(移动到位置x),返回一条ACK消息并进入“移动”状态,直到它到达有序位置。
我想创建一个测试,我发送移动命令,然后继续查询状态,直到它到达最终位置。
我想为两个不同的测试创建两个版本的模拟,一个是我希望设备成功到达最终位置,另一个是失败。
要问太多了?
答案 0 :(得分:5)
如果程序中有串行端口对象的接口,那么Moq可以通过创建模拟串行端口对象来实现(Moq适用于任何复杂的存根和模拟)。
如果您希望在到达硬件之前拦截对BCL SerialPort
类的调用(无需创建串行端口接口和实现,再加上测试实现)那么你需要更强大的东西。这就是Moles的用途。
如果您想实际模拟设备,那么这超出了“单元测试”。在此级别,可以使用com0com添加一对虚拟串行端口,并为您的设备编写可与之交谈的模拟器。在这个级别,自动化测试要复杂得多(尽管不是不可能)。
答案 1 :(得分:0)
如果您使用模拟进行TDDing,那么您应该让测试定义您的对象。在您编写任何测试之前,听起来您已经有了设计理念。
您的初步设计有:
Timeout
函数这已经是您SerialController
必须履行的职责。哇,没有任何测试就可以实现很多。
开始不错。
尝试并测试'最后责任时刻'的想法。
那么你要使用的语法呢?
您可能需要查看此内容:how-to-test-reliability-of-my-own-small-embedded-operating-system
我给出了Atomic Object的硬件和James Greening博客的链接。詹姆斯有一些关于使用硬件进行TDD的好文章(不介意ruby,c和c ++的东西。如果你做硬件,那么之前你已经玩过c和c ++;)。
顺便说一下,你的表现看起来非常令人兴奋。