在测试过程中使用模拟是值得的吗?

时间:2010-02-19 15:01:33

标签: .net unit-testing mocking

在这学期期间,我的教授试图说服我们为什么在开发过程中使用单元测试是好的,为什么验证数据很好(微软应用程序块),他还告诉我们使用模拟(RhinoMocks)来测试我们的我们无法访问数据库的方法。

我必须使用模拟进行一些单元测试,为了使它们工作,我必须手动创建测试我的方法所需的对象层次结构(我花了一些时间来编写我需要的所有东西)。

我想提出的问题:在制作中使用模拟有用吗?我每次有机会都应该使用它吗?而且,为了测试使用模拟的方法而编写所有内容所做的努力是否会得到回报?

谢谢

5 个答案:

答案 0 :(得分:1)

是的,使用模拟对象作为中的一个您的许多单元测试工具绝对值得努力。

但是,它最适合测试驱动开发,因为测试推动了设计。当您开始感受紧密耦合代码的痛苦因为您必须维护深层嵌套结构时,您知道是时候重构为更松散耦合的API。

答案 1 :(得分:1)

模拟解决了以下问题:

  • 没有它们,你的测试就会结束 测试比你的代码更多 测试即可。所以,如果有一个错误 将被标记的依赖项 在你的测试中(或者更糟糕的是,它可能会 掩盖代码中的错误)
  • 积分可能会返回 你写的时候会有不同的结果 由于外部测试与测试运行的时间进行比较 依赖性改变(想想 - 改变 数据库状态)
  • 整合时 外部系统你的测试会运行很多 的即可。这将导致其他 开发人员不经常运行它们 因此降低了你的价值 测试
  • 如果使用得当,他们会做 测试更易于阅读和意图 你的模块更加明显。

答案 2 :(得分:0)

这个没有权利。模拟框架(如RhinoMocks)可以做一些强大的功能。我个人的选择是我喜欢滚动我自己的模拟对象。如果我发现这很难,我会​​把它当作一种气味,我的设计中出了问题。

我确实在遗留代码上使用模拟代码,或者在构建我的单元测试时需要很多代码。

我接受使用模拟框架可以学到更多东西。

答案 3 :(得分:0)

对于我当前的项目,我仍然在大多数时间为单元测试编写存根对象。只有一次我真的觉得需要一个模拟对象并且我手动编写它。

我建议非常务实地采取这个措施​​:如果你需要很多模拟对象,可以考虑学习一个模拟框架(当然也需要付出代价),否则使用存根对象或偶尔手工编写模拟对象。

答案 4 :(得分:0)

我不确定RhinoMocks是否具有相同的功能,但是使用moq,您可以从对象层次结构中获得所需内容,而无需实际创建它。

IE中。如果您的方法接受IUser并且需要访问IUser.Person.ContactInfo.PhoneNumbers.BusinessPhone,则无需创建整个图形。你只需要这样做:

var mockUser = new Mock(); mockUser.Setup(u => u.Person.ContactInfo.PhoneNumbers.BusinessPhone).Returns(“555-1212”);

这可能很有价值,但也可能导致设计不佳,如上所述。