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
。
我想知道 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
。