gpt4 book ai didi

c# - 什么时候使用 Mock v. Stub,或者什么都不用?

转载 作者:太空狗 更新时间:2023-10-29 18:31:23 34 4
gpt4 key购买 nike

我一直在阅读 Mocks 和 Stubs,了解它们的区别和用途。我仍然有点困惑,但我想我已经明白了。

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

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

当我测试这个库时,在任何地方使用模拟/ stub 是否有意义?

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

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

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

最佳答案

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

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

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

模拟

正如我提到的,模拟用于断言中。当您的组件的预期行为它应该与其他组件对话时 - 使用 mock。所有那些

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

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

stub

对于 stub ,它有点不同。是否使用 stub 是一个设计问题。一旦您遵循常规的松散耦合、基于依赖项注入(inject)的设计,最终您将得到大量接口(interface)

现在测试的时候,接口(interface)返回值怎么办?您要么 stub 它,要么使用真正的实现。每种方法都有其优点和缺点:

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

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

工作单元

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

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

当然,您可以将它们分开并一直 stub ,但是...它真的是您的单元吗?

关于c# - 什么时候使用 Mock v. Stub,或者什么都不用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30925260/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com