反对在RSpec测试中使用之前,之后和主题的论点是什么?

我刚刚开始编写RSpec测试,我遇到了thinkbot的Style Guide ,它建议不要letlet!beforesubject (以及其他)。

我也在其他几个地方读过类似的建议(包括旧的RSpec文档警告before(:all) ),但我似乎无法找到反对它们的实际论点。

所以问题是:

为什么我不应该在测试中使用这些方法? 什么是更好的方法?

有趣的问题; 我想要了解更多的东西……所以挖了一下,这就是我发现的:

关于let等的Thoughtbot风格指南格言

  1. 在样式指南的早期版本中 ,该声明还有更多内容:

    避免它,let,let!,指定,主题和其他DSL。 更喜欢明确性和一致性。

  2. ThoughtBot的人发了一个post,让名字让我们不要 。 另请参阅Github Commit Comment对话的链接

  3. 在他们最近的一个播客中,ThoughtBot的首席技术官Joe Ferris解释了为什么使用letsubject不是一个好主意。 在接下来的5分钟内,从27m37s标记开始播放名为Something Else Was Smellier的播客。

  4. 在旧版ThoughtBot博客中详细讨论的反模式“神秘访客”是为什么不使用let及其表兄弟的主要原因。

总结一下我对上述所有内容的理解非常简洁:

使用let等人很难快速了解测试中发生的情况,并要求此人花一些时间进行连接。

编写测试,使其易于理解而不需要太多努力。

此外,在测试中使用let free会导致测试之间过度共享,并且会产生隐含的common fixtures – 即,即使不适用,也要为每个正在编写的测试启动一个通用夹具。

前(:所有)

反对使用before(:all)的论点是直截了当的。 正如旧的rspec文档中所解释的那样:

警告:通常不鼓励使用before(:all)和after(:all),因为它引入了Examples之间的依赖关系。 如果你知道自己在做什么,它可能对非常昂贵的操作有用。

before(:all)只在ExampleGroup的开头执行一次。 因此,有可能无意中在实施例之间引入依赖性。 Thoughtbot关于测试不容易理解的断言也适用于此。

总之,编写更好的规范的建议似乎是:

  1. 编写测试,以便快速浏览它们。
  2. 知道你在做什么。

避免它,let,let !,指定,before和subject。

真? 这样可以减少RSpec DSL下的支路。 不妨回到使用测试/单元。

至于为什么他们会避免let ,Thoughtbot说:“我们有一篇博文在很长时间内发布,希望可以解释。” 我会饶有兴趣地等待那些珍贵的智慧 – 但在此期间,请带上一粒盐的风格指南。

编辑

上述博客文章提供了一些有趣的阅读。