2016-08-02 8 views
0

Ich arbeite durch railstutorial.org und in unserer ersten Testsuite haben wir eine Instanzvariable in einer setup Methode eingerichtet.Warum Setup-Methode für Testsuiten in Ruby on Rails verwenden?

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 

Warum machen wir das, anstatt es gerade als Instanzvariable zu definieren?

Antwort

1

Sie definieren es als Instanzvariable. Wenn der Test ausgeführt wird, wird die Klasse (StaticPagesControllerTest) instanziiert und die Setup-Funktion für diese Instanz aufgerufen, nicht auf der Klasse. Wenn Sie die folgenden stattdessen versucht zu tun, es wäre eine Klassenstufe Instanzvariable nicht zugänglich von Instanzen definieren:

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 
... 

Siehe this page für eine Erklärung des Unterschieds.

Sie könnten eine Klassenvariable verwenden (@@base_title), aber das könnte später zu überraschenden Konsequenzen führen, z. wenn Sie den Test unterklassifizieren wollten.

Hier ist eine schnelle Demonstration:

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

Ich bin nicht sicher, was Sie meinen, dass, wenn ich versuchte, den Code-Block laufen Sie es geschrieben würde eine Klassenstufe Instanzvariable nicht zugänglich von Instanzen definiert. Von dem, was ich sagen kann, ist es eine Instanzvariable, auf die jede Instanz zugreifen kann (jedes Mal eine andere Kopie), nicht wahr? –