我知道 Dan North 设计 BDD 的意图之一是让词汇表远离测试领域的复杂性。但是,在实现由外向内的方法时,我们似乎仍然需要对模拟行为(或存根行为,如果您愿意的话)有所了解。North 在此视频中建议,如果我从最外层的域对象开始,然后向内工作,我会在发现协作者时模拟它们,然后用适当的实现替换它们。所以最后,我得到了一组端到端的测试。
Martin Fowler 在这篇博文中定义了 TDD 的两个阵营时似乎对此有所不同:“经典 TDD”尽可能使用真实对象,必要时使用模拟,以及“模拟 TDD”,在大多数情况下更喜欢模拟。他认为 BDD 倾向于后者。即,在开发功能结束时,“mockist”方法会在实际测试中留下模拟(抱歉在 BDD 讨论中使用该词)。
公平地说,这两种材料都有多年的历史了,也许随着 BDD 在单元级别应用和接受级别之间的界限发展,事情变得更加清晰。
但我对社区的问题基本上是:当我的故事完成后,我的场景实际上应该进行多少端到端测试? North解释说 BDD 需要抽象。例如,当我测试登录行为时,我的场景将详细说明登录过程的含义。但是,当我在做其他一些需要但不是关于登录的场景时,我不想一遍又一遍地执行这些步骤。我想要一个简单的抽象,简单地说“假设我已登录”,这样我就可以执行我的其他行为。
因此,我的抽象方法似乎是模拟某些合作者(或提供“测试替身”),并且某些场景可能比其他场景更多地使用它们。例如,我是否总是模拟外部资源,例如数据库或邮件服务器?
也许我问错了问题。BDD 就是关于沟通、缩短反馈周期和发现你不知道的东西。只要我们感兴趣的行为确实有效,也许什么和什么不嘲笑是一个无关紧要的问题。我很好奇其他人的方法是什么。