Кога да използвате 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 вместо блок преди“, намерена някъде в публикацията в блога.

Благодаря ти много!


person rudkovskyi    schedule 29.08.2016    source източник
comment
Що се отнася до мен, нека е мързелива оценка. А преди ще създаде всички записи, дори и да не са посочени. Променливите, дефинирани с 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 и защо бихте го използвали вместо преди. Там е смисълът. Не разбирам смисъла да дефинирам 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