我刚开始编写 RSpec 测试,遇到了thinkbot 的 Style Guide,它建议反对let
、let!
和(before
以及subject
其他)。
我还在其他一些地方阅读过类似的建议(包括关于 的旧RSpec 文档警告before(:all)
),但我似乎找不到反对它们的实际论点。
所以问题是:
为什么我不应该在我的测试中使用这些方法?更好的方法是什么?
我刚开始编写 RSpec 测试,遇到了thinkbot 的 Style Guide,它建议反对let
、let!
和(before
以及subject
其他)。
我还在其他一些地方阅读过类似的建议(包括关于 的旧RSpec 文档警告before(:all)
),但我似乎找不到反对它们的实际论点。
所以问题是:
为什么我不应该在我的测试中使用这些方法?更好的方法是什么?
有趣的问题;我也想了解更多的东西......所以挖了一下,这就是我发现的:
let
等。在早期版本的风格指南中,该声明还有更多内容:
避免使用它的、让、让!、指定、主题和其他 DSL。更喜欢明确性和一致性。
ThoughtBot 的人在 let name let's not上发表了一篇文章。另请参阅Github 提交评论对话的链接
在他们最近的一个播客中,ThoughtBot 的首席技术官Joe Ferrislet
解释了为什么使用and不是一个好主意subject
。在接下来的 5 分钟内,从 27 分 37 秒开始收听名为“其他东西很臭”的播客。
在较早的 ThoughtBot 博客文章中详细讨论了测试反模式“神秘客人”是为什么不使用let
及其表亲的主要原因。
非常简洁地总结我对以上所有内容的理解:
使用
let
et al 很难一目了然地理解测试中发生的事情,并且需要人们花一些时间来建立联系。编写测试,使其易于理解,无需太多努力。
此外,
let
在测试中自由使用会导致测试之间过度共享,并且会导致隐含性common fixtures
——即,即使在不适用的情况下,也可以为每个正在编写的测试使用一个通用的固定装置。
反对使用的论点before(:all)
是直截了当的。如旧 rspec 文档中所述:
警告:通常不鼓励使用 before(:all) 和 after(:all),因为它引入了示例之间的依赖关系。尽管如此,如果您知道自己在做什么,它可能对非常昂贵的操作很有用。
before(:all) 仅在 ExampleGroup 开始时执行一次。因此,可能会无意中在示例之间引入依赖关系。Thoughtbot 关于测试不容易理解的断言也适用于此。
总之,编写更好规范的建议似乎是:
我的想法...
避免它的,让,让!,指定,之前和主题。
真的吗?这从 RSpec DSL 下切掉了腿。还不如回到使用测试/单元。
至于他们为什么要避免let
,Thoughtbot 说:“我们很快就会发布一篇博文,希望能解释一下。” 我会饶有兴趣地等待那些智慧的珍珠——但与此同时,对风格指南持保留态度。
编辑
前面提到的博客文章会引起一些有趣的阅读。