2013-10-25 55 views
2

可以向我解釋爲什麼有必要使用let!而不是在這種情況下呢?只有當我包括!時,測試纔會通過。我以爲我明白,讓該塊在每個「it」語句之前自動執行,但顯然情況並非如此。Rspec:讓我們帶着感嘆號

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,所以那裏的block代碼不會被執行,記錄也不會被FactoryGirl創建。

+0

通常,如果您發現您正在使用'let!',那麼您確實應該使用'before'。如果你總是需要執行代碼,它就屬於'之前'。還要注意,你從來沒有真正使用你的let變量,所以他們甚至不需要一個名字。 – Shepmaster