【问题标题】:How can I create a SerialPort mock using the Moq library?如何使用 Moq 库创建 SerialPort 模拟?
【发布时间】:2011-02-24 18:28:26
【问题描述】:

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

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

一个简单的例子:

我与之交互的其中一个设备接收到一个命令(移动到位置 x),返回一个 ACK​​ 消息并进入“移动”状态,直到它到达指定的位置。

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

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

问的太多了?

【问题讨论】:

    标签: c# .net unit-testing mocking moq


    【解决方案1】:

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

    您的初步设计有:

    • 命令发送者
    • 命令接收者
    • 轮询(异步/同步)
    • 推论你必须有一个Timeout 函数

    这已经是您的SerialController 必须履行的职责。哇,在没有任何测试的情况下实现了很多。

    轻松愉快地开始。

    '最后的责任时刻'的想法进行尝试和测试。

    还有你要使用的语法呢?

    你可能想看看这个:how-to-test-reliability-of-my-own-small-embedded-operating-system

    我提供了指向 Atomic Object 的硬件制造方式和 James Greening 博客的链接。 James 有一些关于使用硬件进行 TDD 的好论文(不要介意 ruby​​、c 和 c++ 的东西。如果你在做硬件,那么你以前玩过 c 和 c++ ;))。

    顺便说一句,你的所作所为看起来很令人兴奋。

    【讨论】:

    • 感谢您的回答。所有有效的考虑,但我相信我们冒着陷入不是我问题核心的讨论的风险。我已经尝试了这两种风格,我仍然认为在测试之前进行一些设计是有益的,但我看到了双方。不过,我的问题更具体地针对如何使用 Moq 来做我目前正在手动做的事情。
    • @Padu - 我认为您对@Stephen 的评论强化了我的观点'......但其他人实施了一些更智能的模拟'。模拟不应该模拟 smarter。这就是为什么我试图指出您的测试场景有太多事情无法有效使用模拟框架。
    【解决方案2】:

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

    如果您想拦截对 BCL SerialPort 类的调用在它们到达硬件之前(无需创建串行端口接口和实现以及测试实现),那么你需要更强大的东西。这就是Moles 的用途。

    如果您想实际模拟设备,那么这超出了“单元测试”的范围。在这个级别,可以使用com0com 添加一对虚拟串行端口,并为您的设备编写一个可以与您的测试通信的模拟器。在这个级别上,自动化测试要复杂得多(尽管并非不可能)。

    【讨论】:

    • 是的,我已经有一个 ISerialDrive、一个 SerialPortDrive 和几个 MockSerialPortDrive 类。我将 SerialPortDrive 用于我的生产代码,并为我正在测试的每种类型的设备使用一个模拟。有些非常简单,可以很容易地被 Moq 模拟所取代,但有些则对它们连接的硬件进行了一些更智能的模拟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2010-10-19
    • 2016-09-30
    • 2019-10-06
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多