30

我刚开始编写 RSpec 测试,遇到了thinkbot 的 Style Guide,它建议反对letlet!和(before以及subject其他)。

我还在其他一些地方阅读过类似的建议(包括关于 的旧RSpec 文档警告before(:all)),但我似乎找不到反对它们的实际论点。

所以问题是:

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

4

3 回答 3

31

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

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

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

    避免使用它的、让、让!、指定、主题和其他 DSL。更喜欢明确性和一致性。

  2. ThoughtBot 的人在 let name let's not上发表了一篇文章。另请参阅Github 提交评论对话的链接

  3. 在他们最近的一个播客中,ThoughtBot 的首席技术官Joe Ferrislet解释了为什么使用and不是一个好主意subject。在接下来的 5 分钟内,从 27 分 37 秒开始收听名为“其他东西很臭”的播客。

  4. 在较早的 ThoughtBot 博客文章中详细讨论了测试反模式“神秘客人”是为什么不使用let及其表亲的主要原因。

非常简洁地总结我对以上所有内容的理解:

使用letet al 很难一目了然地理解测试中发生的事情,并且需要人们花一些时间来建立联系。

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

此外,let在测试中自由使用会导致测试之间过度共享,并且会导致隐含性common fixtures——即,即使在不适用的情况下,也可以为每个正在编写的测试使用一个通用的固定装置。

之前(:全部)

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

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

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

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

  1. 编写测试,使它们一目了然就容易理解。
  2. 知道你在做什么。
于 2012-10-13T03:54:06.763 回答
2

我的想法...

  1. 通过使用上下文,之前,让,让!测试服表现更好(跑得更快)
  2. 通过使用这种结构,可以使用相同的继承思想创建共享上下文,因此可以覆盖特定情况下需要的内容
  3. 强大的shouda matchers依赖于主题才能工作
  4. rails 特定类型的规范(控制器、模型)依赖于幕后的 let、before 和 context
  5. Let 是延迟加载,如果在特定测试中从未引用过它并不表示过度共享,这意味着即使它可以访问 100 个 let,但它只使用 1,其他 99 个根本不会被计算
  6. 不仅是开发人员必须阅读的测试代码来理解测试套件,也是测试套件在运行时的输出,它对正在测试的内容提供了很多意义
  7. 我同意 before(:all) 混淆了很多依赖项,但出于性能原因,我会在需要时使用它
于 2018-11-16T16:12:07.677 回答
1

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

真的吗?这从 RSpec DSL 下切掉了腿。还不如回到使用测试/单元。

至于他们为什么要避免let,Thoughtbot 说:“我们很快就会发布一篇博文,希望能解释一下。” 我会饶有兴趣地等待那些智慧的珍珠——但与此同时,对风格指南持保留态度。

编辑

前面提到的博客文章会引起一些有趣的阅读。

于 2012-10-17T05:10:38.753 回答