Когда использовать RSpec's let! а не раньше?

Мне сказали, что имеет смысл использовать блок let!() вместо блока before(:each). Однако я не вижу особой логики в этом. Есть ли вообще смысл делать что-то вроде примера ниже:

context 'my super context' do
  let!(:something) do
    Model.create(subject: "Hello", body: "World")
  end

  it '...' do
    # We never call something
    # All we want is just to evaluate and create the record
  end
end

Имейте в виду, что вы вообще не будете вызывать something нигде в этом примере. Технически я не вижу большой разницы между этим и этим, если только это не является более строгим и простым для понимания без документации, как простой английский:

context 'my super context' do
  before(:each) do
    Model.create(subject: "Hello", body: "World")
  end

  it '...' do
    # We never call something
    # All we want is just evaluate and create the record
  end
end

Может ли кто-нибудь помочь мне понять идею правила, которое мне дали? Я могу понять, почему вы использовали бы let вместо before(:all) и before(:each) с переменной внутри. Но здесь просто создается впечатление, что они просто слепо следуют фразе «используйте хелпер let вместо блока before», найденной где-то в сообщении в блоге.

Большое тебе спасибо!


person rudkovskyi    schedule 29.08.2016    source источник
comment
Насколько я понимаю, пусть оценивается лениво. A before создаст все записи, даже если на них нет ссылок. Переменные, определенные с помощью let, будут оцениваться только в том случае, если они использовались позже в ваших тестах.   -  person theDrifter    schedule 30.08.2016
comment
Первый ответ здесь более подробно описан stackoverflow.com/questions/5359558/when-to-use -rspec-let   -  person theDrifter    schedule 30.08.2016
comment
@theDrifter закрыть как дубликат :)   -  person Ven    schedule 30.08.2016
comment
@Ven не совсем другой вопрос. Я говорю о let! Я знаю разницу между let и почему вы должны использовать его вместо before. В этом суть. Я не понимаю смысла определять let!(:abcd) { Model.create() } оценку кода. Он создаст запись, но никогда не вызовет abcd позже. Я имею в виду, что вы могли бы сделать это внутри блока с таким же успехом. Разницы никакой нет, разве что второй пример понятнее и логичнее.   -  person rudkovskyi    schedule 30.08.2016


Ответы (1)


Нет, не рекомендуется всегда использовать блок let!, а не блок before. Вы правы:

  • Если вы хотите запускать блок кода перед каждым примером, и вам нужно, чтобы этот код возвращал значение, используйте let!.
  • Если вы хотите запускать блок кода перед каждым примером, но вам не нужно передавать значение из этого кода непосредственно в ваш пример, используйте before. (Использование let! могло бы ввести читателя в заблуждение, заставив его думать, что используется его значение.)

Обратите внимание, что блоки let! и before в любом случае следует использовать с осторожностью. Они создают риск того, что более поздние авторы тестов добавят тесты в тот же блок, которым не нужны результаты let! или before, что сделает эти тесты более трудными для понимания и медленнее.

person Dave Schweisguth    schedule 30.08.2016