反对在RSpec测试中使用之前,之后和主题的论点是什么?
我刚刚开始编写RSpec测试,我遇到了thinkbot的Style Guide ,它建议不要let
, let!
, before
和subject
(以及其他)。
我也在其他几个地方读过类似的建议(包括旧的RSpec文档警告before(:all)
),但我似乎无法找到反对它们的实际论点。
所以问题是:
为什么我不应该在测试中使用这些方法? 什么是更好的方法?
有趣的问题; 我想要了解更多的东西……所以挖了一下,这就是我发现的:
关于let
等的Thoughtbot风格指南格言
-
在样式指南的早期版本中 ,该声明还有更多内容:
避免它,let,let!,指定,主题和其他DSL。 更喜欢明确性和一致性。
-
ThoughtBot的人发了一个post,让名字让我们不要 。 另请参阅Github Commit Comment对话的链接
-
在他们最近的一个播客中,ThoughtBot的首席技术官Joe Ferris解释了为什么使用
let
和subject
不是一个好主意。 在接下来的5分钟内,从27m37s标记开始播放名为Something Else Was Smellier的播客。 -
在旧版ThoughtBot博客中详细讨论的反模式“神秘访客”是为什么不使用
let
及其表兄弟的主要原因。
总结一下我对上述所有内容的理解非常简洁:
使用
let
等人很难快速了解测试中发生的情况,并要求此人花一些时间进行连接。编写测试,使其易于理解而不需要太多努力。
此外,在测试中使用
let
free会导致测试之间过度共享,并且会产生隐含的common fixtures
– 即,即使不适用,也要为每个正在编写的测试启动一个通用夹具。
前(:所有)
反对使用before(:all)
的论点是直截了当的。 正如旧的rspec文档中所解释的那样:
警告:通常不鼓励使用before(:all)和after(:all),因为它引入了Examples之间的依赖关系。 如果你知道自己在做什么,它可能对非常昂贵的操作有用。
before(:all)只在ExampleGroup的开头执行一次。 因此,有可能无意中在实施例之间引入依赖性。 Thoughtbot关于测试不容易理解的断言也适用于此。
总之,编写更好的规范的建议似乎是:
- 编写测试,以便快速浏览它们。
- 知道你在做什么。
避免它,let,let !,指定,before和subject。
真? 这样可以减少RSpec DSL下的支路。 不妨回到使用测试/单元。
至于为什么他们会避免let
,Thoughtbot说:“我们有一篇博文在很长时间内发布,希望可以解释。” 我会饶有兴趣地等待那些珍贵的智慧 – 但在此期间,请带上一粒盐的风格指南。
编辑
上述博客文章提供了一些有趣的阅读。
- 显示每个rspec示例的运行时
- Capybara :: ElementNotFound仅适用于特拉维斯的所有规格
- 如何在RSpec和Rails中处理模拟嵌套资源?
- 如何在RSpec中测试send_data? 或者……在这种情况下我应该测试什么?
- spork 0.9.2和rspec 3.0.0 =未初始化的常量RSpec :: Core :: CommandLine(NameError)
- rails教程期望css标题与文本返回一些东西
- Hartl第11章Ajax未定义局部变量或方法`cookies’
- Rspec / Capybara:测试是否调用控制器方法
- Rspec 3.未定义的局部变量或方法`response’for#