不久前我读到了模拟不是存根 http://www.martinfowler.com/articles/mocksArentStubs.htmlMartin Fowler 的文章,我必须承认我有点害怕外部依赖性增加的复杂性,所以我想问:
单元测试时最好使用什么方法?
始终使用模拟框架来自动模拟正在测试的方法的依赖关系是否更好,或者您更喜欢使用更简单的机制(例如测试存根)?
正如口头禅所说:“用最简单、可行的方法。”
- 如果假课程可以完成工作,那就跟着他们吧。
- 如果您需要模拟具有多个方法的接口,请使用模拟框架。
避免使用模拟always因为它们使测试变得脆弱。您的测试现在对实现调用的方法有了复杂的了解,如果模拟的接口或您的实现发生变化……您的测试就会失败。这很糟糕,因为您将花费额外的时间来运行测试,而不仅仅是让 SUT 运行。测试不应与实现过于密切。
所以请运用你最好的判断力.. 我更喜欢模拟,因为它可以帮助我节省用 n>>3 方法编写更新假类的时间。
Update尾声/审议:
(感谢 Toran Billups 提供的模拟测试示例。见下文)
嗨,Doug,我认为我们已经进入了另一场圣战 - 经典 TDD 者 vs Mockist TDD 者。我想我属于前者。
- 如果我在 test#101 Test_ExportProductList 上,我发现我需要向 IProductService.GetProducts() 添加一个新参数。我这样做让这个测试绿色。我使用重构工具来更新所有其他引用。现在我发现所有调用该成员的模拟测试现在都崩溃了。然后我必须回去更新所有这些测试——浪费时间。为什么 ShouldPopulateProductsListOnViewLoadWhenPostBackIsFalse 失败?是因为代码被破坏了吗?相反,测试被破坏了。我赞成一次测试失败 = 1 个需要修复的地方。嘲笑频率与此相反。存根会更好吗?如果是的话,我有一个 fake_class.GetProducts() .. 当然可以更改一个地方,而不是通过多个 Expect 调用进行霰弹手术。最后,这是一个风格问题.. 如果您有一个通用的实用方法 MockHelper.SetupExpectForGetProducts() - 那也足够了.. 但您会发现这是不常见的。
- 如果在测试名称上放置白色条带,则测试将难以阅读。模拟框架的大量管道代码隐藏了正在执行的实际测试。
- 要求您学习模拟框架的这种特殊风格
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)