2015-05-22 93 views
1

我想知道方法和讓rspec裏面的定義描述block嗎?爲什麼我應該使用let而不是def?let和def之間的區別

let(:create_user) { post :create} 

Vs的

def create_user 
    post :create 
end 

這兩種方法似乎工作相同的測試裏面:

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

回答

3

通常你會使用let定義某種正在測試(例如let(:apple) { 2 + 3 })的值。 let另一個重要的是它使用memoization。這意味着,一旦您調用let子句的名稱,結果將被緩存並且不再進行計算(apple變爲5,並且2 + 3不會再次計算)。

您通常會使用def來定義方法。在規範中通常使用方法來共享測試之間的通用邏輯,例如規範的複雜設置。

let有另一個有用的屬性 - 你可以使用它的同義詞subject,它可以幫助你縮短你的specs

4

不知道這是唯一的區別,但let memoizes它的價值。因此,這將是更接近:

def create_user 
    @_create_user ||= post :create 
end 
+0

太好了。值在「it」塊級別內而不是在「describe」塊內被記憶。 – knagode

1

另一個重要的區別是您可以將參數傳遞給方法,但不能傳遞給let