2013-10-25 3 views
2

Может ли пояснить мне, почему нужно использовать let! а не в этом случае? Тест проходит только тогда, когда я включаю!. Я думал, что понял, что let будет автоматически выполняться перед каждым оператором «it» внутри этого блока, но, по-видимому, это не так.Rspec: let versus let с восклицательным знаком

describe Artist do 

    before do 
    @artist = Artist.new(name: "Example User", email: "[email protected]", 
       password: "foobar", password_confirmation: "foobar") 
    end 
    subject { @artist } 

    describe "virtual requests" do 
    let!(:virtual1) { FactoryGirl.create(:virtual_request, artist: @artist) } 
    let!(:virtual2) { FactoryGirl.create(:virtual_request, artist: @artist) } 

    it "should be multiple" do 
     @artist.virtual_requests.count.should == 2 
    end 
    end 
end 
+0

нашел отличное объяснение здесь http://stackoverflow.com/questions/17407733/trouble-differentiating-rspecs-let-vs-let –

+0

Почему это не художник в 'let'? – apneadiving

+0

Мне пришлось использовать метод .dup в какой-то момент спецификации, не работает с переменной let, поэтому я переключил его на экземпляр. –

ответ

2

Потому что let является ленивым. Если вы этого не сделаете, это ничего не сделает.

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

В вашем коде, если вы замените let! на let, ваш тест не пройдет.

Причина, по которой вы не звонили :virtual1 и :virtual2, поэтому код внутри этого блока не будет выполнен, и запись не будет создана FactoryGirl.

+0

Часто, если вы обнаружите, что используете 'let!', Вы действительно должны использовать 'before' вместо этого. Если вам всегда нужно выполнять код, он принадлежит 'before'. Также обратите внимание, что вы никогда не используете свои переменные let, поэтому им даже не нужно имя. – Shepmaster

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