小编典典

何时使用 RSpec let()?

all

我倾向于使用 before 块来设置实例变量。然后我在我的示例中使用这些变量。我最近遇到了let()。根据 RSpec 文档,它用于

… 定义一个记忆化的辅助方法。该值将在同一示例中的多个调用中缓存,但不会跨示例缓存。

这与在前块中使用实例变量有何不同?还有什么时候应该使用let()vs before()


阅读 130

收藏
2022-03-14

共1个答案

小编典典

let出于以下几个原因,我总是更喜欢实例变量:

  • 实例变量在引用时立即存在。这意味着,如果您对实例变量的拼写粗心大意,则会创建一个新变量并将其初始化为nil,这可能会导致细微的错误和误报。由于创建了一个方法,当你拼错它时let你会得到一个,我觉得这更可取。NameError它也使重构规范变得更加容易。
  • 一个before(:each)钩子将在每个示例之前运行,即使该示例不使用该钩子中定义的任何实例变量。这通常没什么大不了的,但是如果实例变量的设置需要很长时间,那么您就是在浪费周期。对于 定义的方法let,初始化代码仅在示例调用时运行。
  • 您可以将示例中的局部变量直接重构为 let,而无需更改示例中的引用语法。如果重构为实例变量,则必须更改示例中引用对象的方式(例如添加@)。
  • 这有点主观,但正如 Mike Lewis 指出的那样,我认为它使规范更易于阅读。我喜欢定义我所有的依赖对象let并保持我的it块简洁的组织。

相关链接可以在这里找到: http
://www.betterspecs.org/#let

2022-03-14