我想知道方法和讓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)
我想知道方法和讓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)
通常你會使用let
定義某種正在測試(例如let(:apple) { 2 + 3 }
)的值。 let
另一個重要的是它使用memoization。這意味着,一旦您調用let子句的名稱,結果將被緩存並且不再進行計算(apple
變爲5,並且2 + 3
不會再次計算)。
您通常會使用def
來定義方法。在規範中通常使用方法來共享測試之間的通用邏輯,例如規範的複雜設置。
let
有另一個有用的屬性 - 你可以使用它的同義詞subject
,它可以幫助你縮短你的specs。
不知道這是唯一的區別,但let
memoizes它的價值。因此,這將是更接近:
def create_user
@_create_user ||= post :create
end
另一個重要的區別是您可以將參數傳遞給方法,但不能傳遞給let
。
太好了。值在「it」塊級別內而不是在「describe」塊內被記憶。 – knagode