首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候该期待,什么时候去斯图布?

什么时候该期待,什么时候去斯图布?
EN

Stack Overflow用户
提问于 2009-07-10 01:02:59
回答 3查看 6.3K关注 0票数 13

我使用NMock2,并起草了以下NMock类来表示一些常见的模拟框架概念:

  • Expect:这指定了模拟的方法应该返回什么,并说必须进行调用或者测试失败(当伴随着对VerifyAllExpectationsHaveBeenMet()的调用时)。
  • Stub:这指定了模拟方法应该返回什么,但不能导致测试失败。

那我什么时候该做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-10 01:13:04

许多模拟框架正在使模拟和存根的概念更紧密地联系在一起,以至于它们在功能上可以被认为是几乎相同的。然而,从概念的角度来看,我通常试图遵循这样的惯例:

  • Mock:只有当您显式地尝试验证被测试对象的行为时(也就是说,您的测试是说该对象必须调用该对象)。
  • Stub:当您尝试测试某些功能/行为时,为了使其正常工作,您需要依赖一些外部对象(即您的测试是说该对象必须做一些事情,但作为副作用,它可能会调用该对象)

当您确保每个单元测试只测试一件事情时,这一点就变得更清楚了。当然,如果您尝试在一次测试中测试所有内容,那么您也可以期待一切。但是,仅仅期望特定单元测试所检查的内容,代码就会更加清晰,因为您一眼就可以看到测试的目的是什么。

它的另一个好处是,您将稍微更不受更改的影响&在更改导致中断时获得更好的错误消息。换句话说,如果您微妙地更改了您的实现的某些部分,您更有可能只得到一个测试用例破坏,这将准确地告诉您什么是坏的,而不是一套完整的测试中断&只会产生噪音。

编辑:基于一个精心设计的示例,计算机对象对数据库中所有添加的内容进行审计(以伪代码形式),可能会更清楚一些.

代码语言:javascript
复制
public void CalculateShouldAddTwoNumbersCorrectly() {
    var auditDB = //Get mock object of Audit DB
    //Stub out the audit functionality...
    var calculator = new Calculator(auditDB);
    int result = calculator.Add(1, 2);
    //assert that result is 3
}

public void CalculateShouldAuditAddsToTheDatabase() {
    var auditDB = //Get mock object of Audit DB
    //Expect the audit functionality...
    var calculator = new Calculator(auditDB);
    int result = calculator.Add(1, 2);
    //verify that the audit was performed.
}

因此,在第一个测试用例中,我们测试Add方法的功能&不关心审计事件是否发生,但我们碰巧知道,没有auditDB引用,计算器就不能工作,所以我们只需要将其存根,以便为我们提供使特定测试用例工作的功能的最小值。在第二个测试中,我们专门测试当您执行Add时,会发生审计事件,因此我们在这里使用预期(注意,我们甚至不在乎结果是什么,因为这不是我们正在测试的结果)。

是的,您可以将这两个案例组合成一个&执行期望并断言您的结果为3,但随后您将在一个单元测试中测试两个案例。这将使您的测试变得更加脆弱(因为有更大的事情表面积可能会改变以破坏测试)和不太清楚(因为当合并的测试失败时,问题不是很明显。添加不起作用,还是审计不起作用?)

票数 18
EN

Stack Overflow用户

发布于 2011-01-06 12:44:54

“期望操作,存根查询”。如果调用应该改变被测试对象之外的世界状态,那么就让它成为一个期望--你关心它是如何被调用的。如果它只是一个查询,您可以在不改变系统状态的情况下调用它一次或六次,然后对调用进行存根。

还有一件事,请注意,区别在于存根和期望,即单个调用,而不一定是整个对象。

票数 5
EN

Stack Overflow用户

发布于 2009-07-10 01:10:40

好吧..。IMHO --再简单不过了:如果你的测试是为了确保你的演讲者会打电话给Save,那就做一个Expect吧。如果您的测试是为了确保您的演示者在Save抛出时能够优雅地处理异常,那么请执行Stub。

有关更多细节,请查看汉瑟曼和奥舍夫的播客 (“单元测试艺术”的作者)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1107217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档