代码之家  ›  专栏  ›  技术社区  ›  Avram

我应该在生产代码中使用模拟吗?

  •  8
  • Avram  · 技术社区  · 15 年前

    我有一种情况需要 mock 生产中的一些代码。这是为了使代码的一部分在半功能中工作。

    我必须选择编写一个空类(以实现接口),或者使用一个模拟系统(如moq)。

    所以问题是,做模拟系统 击中性能 打破一些可读性 生产代码?

    更新
    例子:

    interface IRocketSystem
    {
       void LaunchTheRocket();
    }
    
    class SimulationRocketSystem:IRocketSystem
    {
    ...
    }
    
    class RocketSystem:IRocketSystem
    {
    ...
    }
    

    我发现我在生产中有一个模拟火箭系统类,这个类很小,在身体中没有很多。模拟系统有一行代码( 新建mock<iRocketsSystem>()。对象 )替换这样的类。

    嘲笑的专家:
    减少项目中的空类。

    8 回复  |  直到 15 年前
        1
  •  10
  •   waxwing    15 年前

    听起来像 Null Object . 我不相信为此使用模拟框架有两个原因。

    首先,它损害可读性。使用适当命名的空类实现接口,然后在该类中记录意图。另一方面,如果使用模拟框架,则需要将文档嵌入代码中的某个地方。此外,它将是混乱的,因为人们倾向于期望在测试代码中模拟,而不理解您使用模拟的意图。

    其次,您必须考虑如果有人修改接口会发生什么。如果添加了方法怎么办?它应该像某些框架那样默认地返回空值吗?如果方法 必须 根据接口合同返回一些特定的返回值。如果您有一个具体的实现,那么编译器至少会在一定程度上保护您。如果你使用一个模拟框架,你可能会走运。

        2
  •  9
  •   Brian Rasmussen    15 年前

    模拟对象是您用于测试的对象,因为它可以让您断言它是正确调用的。在我看来,您要查找的更像是存根或代理对象。

    既然您最终将实现所讨论的类,那么让一个模拟框架为您完成这项工作是毫无意义的,imo。为什么不创建这个类并根据需要实现它呢?

        3
  •  6
  •   S.Lott    15 年前

    空课怎么了?

    事实上,它将被一个真正的类所取代,所以您也可以从一个真正的类开始。

    我想用任何形式的模拟代码 外部 测试是一项坏政策。

        4
  •  2
  •   Christian    15 年前

    你称之为“嘲弄”,但似乎你所做的只是恰当地分离关注。

    在if语句上使用多态性来控制应该发生什么是一件好事。

    例如,假设您希望日志记录是可选的。当务之急是提供 boolean isLogging . 然后每次检查布尔型 if (isLogging) { ...logging code... } .

    但是,如果您将实际的日志代码作为对另一个对象的关注点而分开,那么您可以将该对象设置为执行所需操作的对象。除了拥有一个空路由的日志记录程序(代表日志记录被禁用)和一个实际写入文件的日志记录程序外,它还允许您提供一个日志记录对象,该对象将写入数据库而不是文件,它允许您向日志记录程序添加功能,例如日志文件旋转。

    这只是一个很好的面向对象编程。

        5
  •  2
  •   Brian Agnew    15 年前

    这可能有点不寻常,所以我会在我的评论等中明确指出这是必需的功能。否则会有人对测试代码是如何进入生产的感到非常困惑!

    至于性能,和以往一样,您需要测量它,因为它是如此具体。不过,我冒昧地猜测,由于您在模仿尚未编写的功能,它很可能是 快得多 而不是你的模拟实现。这是您可能需要向用户介绍的内容,因为当您提供最终的功能实现时,他们很可能会看到性能下降:—)

    这个 真实的 解决方案是为现有接口提供一个虚拟实现,并稍后提供真正的实现。

        6
  •  1
  •   Samuel Carrijo    15 年前

    我不太了解性能问题。但是,imho,你必须非常小心可读性。声明一个或多个接口并以两种不同的方式实现不是更好吗?

    --编辑

    模拟可能更容易,使用更少的代码行,但它会增加代码的学习曲线。如果新来的人看到你的代码,他需要更多的时间来理解。就我个人而言,我认为这是代码的一个尚未实现的特性。但是如果有另一个接口实现,或者其他一些好的设计决策,我会更快地“得到它”,并且随着代码的更改感觉更安全。

    嗯,这是个人意见。您的代码将使用与预期不同的模式。它类似于“配置上的约定”。如果您不使用该约定,那么配置它应该会比较困难(在您的情况下,记录并清楚您正在做什么)。

        7
  •  1
  •   Larry Watanabe    15 年前

    我的建议-不要把它投入生产。不要将任何东西投入生产中,因为它会减慢生产速度,破坏生产,或者导致你失去工作:)

    但比我想的更重要的是,你的公司政策是什么?你的经理怎么想?你不应该想独自做出这样的决定,这叫cya。

        8
  •  -1
  •   pmf    15 年前

    我必须选择编写一个空类,或者使用像moq这样的模拟系统。

    将它包装在专用的facade/adapter组件中并使用内部类就足够了。如果需要在系统中传递空类,则会出现问题。