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

时间:2012-10-13 01:05:16

标签: ruby testing rspec

我刚刚开始编写RSpec测试,我遇到了thoughtbot's Style Guide,它推荐letlet!beforesubject(以及其他)

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

所以问题是:

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

3 个答案:

答案 0 :(得分:26)

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

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

  1. earlier version of the style guide中,该声明还有更多内容:

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

  2. ThoughtBot人员发了一个名为let's not的帖子。另请参阅link to the Github Commit Comment conversation

  3. 在他们最近的一个播客Joe Ferris中,ThoughtBot的CTO解释了为什么使用letsubject不是一个好主意。在接下来的5分钟内,从27m37s标记处查看标题为Something Else Was Smellier的播客。

  4. 测试an older ThoughtBot blogpost中详细讨论的反模式'神秘客户'是不使用let及其表兄弟的主要原因。

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

      

    使用let等人很难理解发生了什么   在测试中快速浏览,并要求该人花   一段时间来建立联系。

         

    编写测试,以便在不费力的情况下易于理解。

         

    此外,在测试中大量使用let会导致测试之间过度共享,并且会产生隐式common fixtures - 即使每次测试都有一个共同的夹具,即使它不适用。

    之前(:所有)

    反对使用before(:all)的论点是直截了当的。正如old rspec documentation

    中所述
      

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

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

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

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

答案 1 :(得分:2)

我的想法...

  1. 在使用上下文之前,先让我们放手!测试服性能更好(运行更快)
  2. 通过使用这种构造,可以使用相同的继承思想创建共享上下文,因此可以覆盖特定情况下需要的内容
  3. 强大的比喻匹配者必须依靠主题才能工作
  4. 特定于Rails的规格类型(控制器,模型)依赖于场景的let,场景前后和背景
  5. 让我们放慢脚步,如果在特定测试中从未引用过它,则不代表过度共享,这意味着即使它可以访问100个let,但仅使用1,其他99个也不会被计算
  6. 不仅开发人员必须阅读测试代码才能理解测试套服,它还是运行时测试套服的输出,它对正在测试的内容有很大的意义
  7. 我同意before(:all)混淆了很多依赖关系,但是出于性能原因,我会在需要时使用它

答案 2 :(得分:1)

避免它,让,让!,指定,之前和主题。

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

至于为什么他们会避免let,Thoughtbot说:“我们有一篇博文不久就会发布,希望能够解释。”我会饶有兴趣地等待那些珍贵的智慧 - 但与此同时,请带着一丝盐的风格指南。

修改

aforementioned blog post带来了一些有趣的阅读。