反对在RSpec测试中使用before,let和subject的论点是什么?

Top*_*gio 29 ruby testing rspec

我刚开始写RSpec的测试,我碰上了thoughtbot的风格指南,其中建议对let,let!,beforesubject(等等).

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

所以问题是:

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

Pra*_*thy 28

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

Thoughtbot风格指南格言let等等.

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

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

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

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

  4. 测试反模式'神秘客户',在较旧的ThoughtBot博客帖子中详细讨论,是不使用let及其表兄弟的主要原因.

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

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

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

此外,let在测试中大量使用导致测试之间的过度共享,以及隐含common fixtures- 即,即使不适用,也要为每个正在编写的测试开始使用通用夹具.

前(:所有)

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

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

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

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

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