Cha*_*lor 8 c# unit-testing mocking stubs geometry-class-library
我一直在读Mocks和Stubs,他们的差异和用途.我仍然有点困惑,但我想我已经得到了它的主旨.
现在我想知道应用程序.我可以看到在测试场景中创建"假"对象的用法,其中实际对象太复杂而无法测试一个方面.
但是让我们考虑我的应用程序:我正在研究计算几何库.我们的库定义了点,线,linesegments,向量,多边形和多面体,以及一堆其他对象和所有常见的几何操作.任何给定对象都存储为点或方向列表或较低级别对象.但是这些对象都不会花费超过几毫秒的时间来生成.
当我测试这个库时,在任何地方使用Mocks/Stubs是否有意义?
现在我们只使用特定的测试用例.我们称它们为存根,但我认为它们不符合存根的技术定义.你觉得那个更好的词汇是什么?"测试用例"?"例子"?
SourceCode:https://bitbucket.org/Clearspan/geometry-class-library/src
编辑:请注意,我们正在努力在所有几何对象中保持不变性,因此测试操作结果只是有意义,而不是初始对象的状态更改.
模拟和存根之间的根本区别在于模拟可以使您的测试失败。存根不能。存根用于保证正确的程序流程。它永远不是断言的一部分。
请注意,mock 也可用于保证流量。换句话说,每个模拟也是一个存根,存根永远不是一个模拟。由于如今的职责重叠,您看不到 mock 和 stub 之间的太大区别,而框架设计者则使用更通用的术语(如fake、Replace或catch-all mock)。
这种实现(mock - assert、stub - flow)帮助我们缩小了一些使用场景。从更简单的开始......
正如我提到的,在断言中使用了模拟。当您的组件的预期行为是它应该与其他组件通信时- 使用模拟。所有那些
emailSender.SendEmail(email);
endOfDayRunner.Run();
jobScheduler.ScheduleJob(jobDetails);
Run Code Online (Sandbox Code Playgroud)
只能通过询问“它是否ScheduleJob
使用这样那样的参数调用?”来进行测试。这是你去模拟的地方。通常这将是模拟的唯一使用场景。
使用存根有点不同。是否使用存根是一个设计问题。一旦你遵循常规的松散耦合、基于依赖注入的设计,最终你会得到很多接口。
现在,在测试时,如何从接口返回值?你要么存根它要么使用真正的实现。每种方法都有其优点和缺点:
Angle
类更改CoordinateSystem
可能失败时......这种行为是否可取?是吗?使用哪一种?两个都!这一切都取决于...
我们到达了问题的最终部分和实际部分。你的单元测试的范围是什么?单位是什么?可以CoordinateSystem
从其内部工作和依赖项(Angle
, Point
, Line
)中分离出来,它们可以被存根吗?或者更重要的是,它们应该是吗?
您始终需要确定您的单位是什么。它是CoordinateSystem
单独或可能Angle
,Line
并Point
发挥着重要的一部分呢?在很多很多情况下,单元将由方法及其周围的生态系统组成,包括域对象、辅助类、扩展,有时甚至是其他方法和其他类。
当然,您可以将它们分开并一直存根,但是……这真的是您的单位吗?
归档时间: |
|
查看次数: |
808 次 |
最近记录: |