let和def之间的区别

时间:2015-05-22 13:44:11

标签: ruby rspec

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

let(:create_user) { post :create }

Vs的

def create_user
  post :create
end

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

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

3 个答案:

答案 0 :(得分:5)

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

def create_user
  @_create_user ||= post :create
end

答案 1 :(得分:4)

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

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

let还有另一个有用的属性 - 您可以使用其同义词subject来帮助您缩短specs

答案 2 :(得分:1)

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