let 和 def 的区别

Difference between let and def

我想知道 rspec describe 块中的方法和 let 定义之间的关系?为什么我应该使用 let 而不是 def?

let(:create_user) { post :create }

VS

def create_user
  post :create
end

两种方式在测试中似乎都一样:

expect { create_user }.to change { User.count }.by(1)

不确定这是否是唯一的区别,但 let 记住了它的价值。所以它会更接近于:

def create_user
  @_create_user ||= post :create
end

通常您将使用 let 定义来表示您正在测试的某种值(例如 let(:apple) { 2 + 3 })。 let 的另一个重要之处在于它使用了记忆。这意味着一旦您调用了 let 子句的名称,结果就会被缓存并且不再计算(apple 变为 5 并且 2 + 3 不再计算)。

您通常会使用 def 来定义方法。在规范中,通常使用方法在测试之间共享通用逻辑,例如规范的复杂设置。

let 还有一个有用的 属性 - 你可以使用它的同义词 subject 来帮助你缩短你的 specs.

另一个重要区别是您可以将参数传递给方法,但不能传递给 let