let和def之间的区别

问题描述 投票:3回答:3

我想知道方法和让定义里面的rspec描述块?我为什么要使用let而不是def?

let(:create_user) { post :create }

VS

def create_user
  post :create
end

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

expect { create_user }.to change { User.count }.by(1)
ruby rspec
3个回答
4
投票

通常,您将使用let定义来处理您正在测试的某种值(例如let(:apple) { 2 + 3 })。关于let的另一个重要的事情是它使用了memoization。这意味着一旦你为let子句调用了名字,结果就会被缓存而不再计算(apple变为5,2 + 3永远不再计算)。

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

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


5
投票

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

def create_user
  @_create_user ||= post :create
end

1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.