我刚刚开始编写RSpec测试,我遇到了thoughtbot's Style Guide,它推荐let
,let!
,before
和subject
(以及其他)
我也在其他几个地方读过类似的建议(包括关于before(:all)
的旧RSpec docs警告),但我似乎无法找到反对它们的实际论点。
所以问题是:
为什么我不能在测试中使用这些方法?什么是更好的方法?
答案 0 :(得分:26)
有趣的问题;我想要了解更多的东西......所以挖了一下,这就是我发现的:
let
等的格言在earlier version of the style guide中,该声明还有更多内容:
避免使用,let,let!,指定,主题和其他DSL。更喜欢明确性和一致性。
ThoughtBot人员发了一个名为let's not的帖子。另请参阅link to the Github Commit Comment conversation
在他们最近的一个播客Joe Ferris中,ThoughtBot的CTO解释了为什么使用let
和subject
不是一个好主意。在接下来的5分钟内,从27m37s标记处查看标题为Something Else Was Smellier的播客。
测试an older ThoughtBot blogpost中详细讨论的反模式'神秘客户'是不使用let
及其表兄弟的主要原因。
总结我对上述所有内容的理解非常简洁:
使用
let
等人很难理解发生了什么 在测试中快速浏览,并要求该人花 一段时间来建立联系。编写测试,以便在不费力的情况下易于理解。
此外,在测试中大量使用
let
会导致测试之间过度共享,并且会产生隐式common fixtures
- 即使每次测试都有一个共同的夹具,即使它不适用。
反对使用before(:all)
的论点是直截了当的。正如old rspec documentation:
警告:通常不鼓励使用before(:all)和after(:all),因为它会引入示例之间的依赖关系。不过,如果你知道自己在做什么,它可能对非常昂贵的操作有用。
之前(:all)仅在ExampleGroup开始时执行一次。因此,有可能无意中在实施例之间引入依赖性。 Thoughtbot关于测试不容易理解的断言也适用于此。
总之,编写更好的规范的建议似乎是:
答案 1 :(得分:2)
我的想法...
答案 2 :(得分:1)
避免它,让,让!,指定,之前和主题。
真的?这样可以减少RSpec DSL下的支路。不妨回到使用测试/单位。
至于为什么他们会避免let
,Thoughtbot说:“我们有一篇博文不久就会发布,希望能够解释。”我会饶有兴趣地等待那些珍贵的智慧 - 但与此同时,请带着一丝盐的风格指南。
修改的
aforementioned blog post带来了一些有趣的阅读。