2016-08-02 47 views
0

我正在通過railstutorial.org工作,在我們的第一個測試套件中,我們在setup方法中設置了一個實例變量。爲什麼在Ruby on Rails中使用測試套件的設置方法?

require 'test_helper' 

class StaticPagesControllerTest < ActionDispatch::IntegrationTest 

    def setup 
    @base_title = "Ruby on Rails Tutorial Sample App" 
    end 

    test "should get home" do 
    get static_pages_home_url 
    assert_response :success 
    assert_select "title", "Home | #{@base_title}" 
    end 

    test "should get help" do 
    get static_pages_help_url 
    assert_response :success 
    assert_select "title", "Help | #{@base_title}" 
    end 

    test "should get about" do 
    get static_pages_about_url 
    assert_response :success 
    assert_select "title", "About | #{@base_title}" 
    end 
end 

爲什麼我們這樣做而不是直接將其定義爲實例變量?

回答

1

您正在將其定義爲實例變量。當運行測試時,類(StaticPagesControllerTest)是實例化的以及在該實例上調用的設置函數,而不是在類上。如果你試圖這樣做,而不是下面將定義一個類級別的實例變量不能從實例訪問:

class StaticPagesControllerTest < ActionDispatch::IntegrationTest 

    @base_title = "Ruby on Rails Tutorial Sample App" 

    test "should get home" do 
    get static_pages_home_url 
    assert_response :success 
    assert_select "title", "Home | #{@base_title}" # XXX not defined on instance 
    end 
... 

爲差異的一個解釋見this page

您可以使用類變量(@@base_title),但這可能會在以後引起令人驚訝的後果,例如,如果你想要測試的子類。

這裏有一個快速演示:

class First 
    @a = 'hoge' 
    @@b = 'hoge' 

    def initialize 
    @c = 'hoge' 
    end 

    def give_me_a 
    @a 
    end 

    def give_me_b 
    @@b 
    end 

    def give_me_c 
    @c 
    end 
end 

f = First.new 
# => #<First:0x007fb81607fcd0> 
f.give_me_a 
# => nil 
f.give_me_b 
# => "hoge" 
f.give_me_c 
# => "hoge" 
+0

我不知道你的意思是,如果我試圖運行您發佈的代碼塊,將定義不是從實例訪問一個類級別的實例變量。從我可以告訴它是一個實例變量可以訪問每個不同的實例(每次不同的副本)不是嗎? –