【问题标题】:When to use a Mock v. Stub, or neither?何时使用 Mock v. Stub,或者两者都不使用?
【发布时间】:2015-09-04 16:13:54
【问题描述】:

我一直在阅读有关 Mocks 和 Stubs、它们的区别和用途的信息。我仍然有点困惑,但我想我已经掌握了它的要点。

现在我想知道应用程序。我可以看到在测试场景中创建“假”对象的用途,其中实际对象太复杂而无法测试一个方面。

但是让我们考虑一下我的应用程序:我正在开发一个计算几何库。我们的库定义了点、线、线段、向量、多边形和多面体,以及一堆其他对象和所有常见的几何操作。任何给定的对象都存储为点或方向的列表或较低级别的对象。但是这些对象的生成时间都不超过几毫秒。

当我测试这个库时,在任何地方使用 Mocks/Stubs 有意义吗?

现在我们只使用特定的测试用例。我们称它们为存根,但我认为它们不符合存根的技术定义。你认为更好的词汇是什么? “测试用例”? “例子”?

源码:https://bitbucket.org/Clearspan/geometry-class-library/src

编辑:请注意,我们正在努力在所有几何对象中实现不变性,因此仅测试操作结果才有意义,而不是初始对象的状态更改。

【问题讨论】:

    标签: c# unit-testing mocking stubs geometry-class-library


    【解决方案1】:

    mock 和 stub 的根本区别在于,mock 会使您的测试失败。存根不能。存根用于保证正确的程序流程。它永远不是断言的一部分。

    请注意,mock 也可以用来保证流量。换句话说,每个模拟也是一个存根,而存根永远不是模拟。由于现在的职责重叠,你看不到 mock 和 stub 之间有太大的区别,框架设计者会使用更通用的术语(如 fakesubstitutecatch-all mock)。

    这种实现(mock - assert, stub - flow)帮助我们缩小了一些使用场景。从更简单的开始...

    模拟

    正如我提到的,在断言中使用了模拟。当您的组件的预期行为它应该与其他组件通信 - 使用模拟。所有这些

    emailSender.SendEmail(email);
    endOfDayRunner.Run();
    jobScheduler.ScheduleJob(jobDetails);
    

    只能通过询问“它是否使用这样那样的参数调用ScheduleJob 来进行测试?” 这就是你要模拟的地方。通常这将是 mock 的唯一使用场景。

    存根

    使用 stub 有点不同。是否使用存根是一个设计问题。一旦你遵循常规的松耦合、基于依赖注入的设计,最终你会得到大量的接口

    现在,在测试时,如何从接口返回值?你要么存根它,要么使用真正的实现。每种方法都有其优点和缺点:

    • 使用库生成的存根,您的测试将不那么脆弱,但可能需要更多的前期工作(设置存根等)
    • 在实际实现中,设置工作已经完成,但是当Angle 类更改CoordinateSystem 可能会失败... 这种行为是否可取?

    是吗?使用哪一个?两个都!这一切都取决于...

    工作单元

    我们到达了问题的最终部分和实际部分。你的单元测试的范围是什么? 单位是什么? CoordinateSystem 是否可以与其内部工作和依赖关系(AnglePointLine)分离,它们可以被存根吗?或者更重要的是,他们应该是吗?

    您始终需要确定您的单位是什么。是 CoordinateSystem 单独还是 AngleLinePoint 发挥重要作用?在很多很多情况下,单元将由方法及其周围的生态系统组成,包括领域对象、助手类、扩展,有时甚至是其他方法和其他类。

    当然,您可以将它们分开并一直存根,但是……它真的是您的单位吗?

    【讨论】:

      【解决方案2】:

      根据经验,当您需要模拟行为时使用 Mocks,当您的测试中唯一重要的是您正在与之通信的对象的状态时使用存根。

      考虑到您对帖子所做的编辑,当您需要接收不可变对象时使用存根,但当您需要调用对象公开的操作然后进行模拟时,这样您就不容易失败由于另一个类实现中的错误而导致的测试。

      【讨论】:

        猜你喜欢
        • 2018-06-11
        • 1970-01-01
        • 2016-03-14
        • 2011-03-14
        • 2018-09-14
        • 2015-08-15
        • 2010-11-16
        • 2020-04-17
        相关资源
        最近更新 更多