2013-01-02 67 views

回答

14

我總是喜歡讓實例變量的一對夫婦的原因:

  • 實例變量生效的存在,當他們引用這 意味着,如果您在實例中的任何錯誤變量的拼寫然後 它會明確地引導您遇到一些問題,因爲新實例變量 已初始化爲零。但是在讓你得到NameError的情況下如果你 拼錯了。

  • 而且你會之前 塊,這意味着之前塊將每次執行如果規範不使用 你初始化這些實例變量 規範甚至會被運行在初始化實例變量。下面給出的例子;

    before do 
        @user = Factory :user 
        @movie = Factory :movie 
    end 
    
    it "should have user" do 
        @user.should eq User.first 
    end 
    
    it "should have movie" do 
        @movie.should eq Movie.first 
    end 
    

雖然所有的功能運行正常,但在第一規格和第二沒有用的@user不使用的@movie

你也可以使用let with bang「!」 let!,let是懶惰的評估,如果你不叫它,將永遠不會實例化,使用let來定義memoized助手,而let!是在每個方法調用之前強制評估。

+2

也許他想說的話是這樣的:在所有點,'let'最好實例變量和總是比實例變量更有利。 –

7

我贊成這個問題,但最後我自己回答了這個問題。

首先來描述差異

let方法中使用,直到在該測試中引用它不初始化該變量時 - 這使得它從@instance variables不同,其是從開始初始化。

總的來說,沒有太大的缺陷。如果要確保let對象已初始化,請使用@instance variables。但另一方面,這可以與let!完成相同,所以沒有明顯的理由使用@instance variable

總之,對我來說,有明顯理由使用@instance variable超過let,但沒有明顯的理由使用@instance variables超過let!

@instance variables需要更多的時間來加載,並通過他們,能導致這可以通過使用letlet!

你可以看看這兩個答案,以及避免在代碼中不必要的複雜性,也許它會給你一些更多的信息:

When to use RSpec let()?

RSpec: What is the difference between let and a before block?

相關問題