2016-08-02 14 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

は、ここで簡単なデモです。どのインスタンス変数(毎回別のコピー)でアクセスできるインスタンス変数であるかは分かりません。 –

関連する問題