2015-05-22 4 views
1

Мне интересно, между методом и пусть определение внутри rspec описывает блок? Почему я должен использовать 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» блока уровня, а не на блоке «описать». – knagode

1

Другое важное отличие состоит в том, что вы можете передать параметр методу, но не до let.

Смежные вопросы