嘲笑还是不嘲笑?

Jer*_*nce 6 unit-testing mocking

据我所知,在极限编程和单元测试中,测试必须由另一个开发人员在另一个开发测试方法之前完成(或者从相同的开发人员开始,但测试必须在方法实现之前编写).

好吧,看起来不错,我只需要在给它一些参数时测试一个方法是否具有良好的行为.

但理论与实践的区别在于理论上没有,但在实践中却存在......

我第一次尝试测试时,由于物体之间的关系,我发现在某些情况下很难.我发现了嘲弄的做法,我发现它非常有用,但有些概念让我怀疑.

首先,mocking隐含地说:"你知道该方法是如何运行的,因为你必须知道它需要什么其他对象......".好吧,理论上我的朋友鲍勃写了测试,他只知道当我给它"john"字符串时该方法必须返回true ...这是我使用dao来访问数据库而不是使用内存中的哈希表...

我的可怜的朋友鲍勃将如何编写测试?他会期待我的工作......

好吧,似乎不是纯粹的理论,而是无所谓.但是如果我查看很多模拟框架的文档,它们允许我测试一个方法的调用次数和顺序!哎哟...

但是如果我的朋友Bob必须测试这种方法以确保良好地使用依赖关系,那么该方法必须在测试之前编写,不是吗?

哼......帮我的朋友鲍勃......

我们什么时候停止使用模拟机制(订单验证等)?模拟机制有用吗?理论,实践和模拟:什么是最佳平衡?

Rya*_*art 7

您在描述中似乎缺少的是将合同与实施分开的概念.在C#和Java中,我们有接口.在C++中,只由纯虚函数组成的类可以填充此角色.这些并不是必需的,但有助于建立逻辑分离.因此,除了您似乎遇到的混乱之外,练习应该更像:鲍勃为一个特定的类/功能单元编写单元测试.在这样做时,他为其他类/单元定义了一个或多个接口(合同)来支持这个接口.他不需要立即编写这些文件,而是用模拟对象填充它们,以提供他的测试和被测系统所需的间接输入和输出.因此,一组单元测试的输出不仅仅是驱动单个单元开发的测试,而且包括需要由其他代码实现的合同以支持当前正在开发的单元.

  • 尽管如此,Bob需要指定支持测试方法的内容并不合适.实际上,通过指定您谈到的合同,Bob将定义测试方法的实际实现.这不是他的工作.使用接口并不能真正解决问题.[Komarro](http://code.google.com/p/komarro/)尝试对此问题进行一些改进.看一看... (3认同)