2012-12-27 7 views
5

Ich versuche, einige gemeinsame Code in einem Schienen-Controller-Spezifikation wieder zu verwenden. Ich habe unterschiedliche Kontexte für Admin-Benutzer und normale Benutzer. Allerdings viel über das Verhalten ist das gleiche für bestimmte Aktionen, also versuchte ich, dass gemeinsames Verhalten heraus in eine Hilfsfunktion ziehen:Code-Wiederverwendung in verschiedenen RSPEC-Kontexten

describe SomeController do 
    def common_get_new 
     # common stuff 
    end 

    context "regular users" do 
     describe "GET new" do 
      common_get_new 
     end 
    end 

    context "admin users" do 
     describe "GET new" do 
      common_get_new 
     end 
    end 
end 

Das gibt mir den Fehler:

undefined local variable or method `common_get_new'

Was soll ich tun falsch?

+0

Was ist common_get_new - Setup-Zeug, Anrufe zu sollten, ganze Beispiele, etwas anderes? –

+0

@FrederickCheung Es enthält keine Setup-Sachen. Es enthält mehrere ganze Beispiele. – mushroom

Antwort

13

Haben Sie versucht Shared Examples mit?

describe SomeController do 
    shared_examples_for "common_get_new" do 
    # common stuff 
    end 

    context "regular users" do 
    describe "GET new" do 
     it_should_behave_like "common_get_new" 
    end 
    end 

    context "admin users" do 
    describe "GET new" do 
     it_should_behave_like "common_get_new" 
    end 
    end 
end 

Je nachdem, was in Ihrer common_get_new Methode in Ihrer Frage ist, um einfach zu Ihren Fehlern loszuwerden, können Sie die Methode in spec setzen könnten/support/utilities.rb oder tun als @ Chris Heald hat die Methode am Anfang der Datei vorgeschlagen und definiert.

+0

Danke für den Tipp auf spec/support/utilities.rb! –

+0

Wenn jemand nach einer Möglichkeit sucht, einen Parameter in ein gemeinsames Beispiel zu übergeben: 'shared_examples_for" common_perf_test "do | Name, Nachricht | ' ' setzt "# {name}" ', dann rufen Sie das gemeinsame Beispiel wie folgt auf: ' it_should_behave_like "common_perf_test", "# {description}", message' –

0

Versuchen Sie, Ihre Kontexte neu anordnen, so dass tiefere Kontexte die gleiche Setup-Code teilen können:

describe SomeController do 
    describe "GET new" do 
    before do 
     # common stuff 
    end 

    context "regular users" do 
    end 

    context "admin users" do 
    end 
    end 
end 
+1

Mein Problem damit ist, dass das Zeug, das ich aussortiere, nicht wirklich Setup-Arbeit ist. Bestimmte Abschnitte der Spezifikation sind in verschiedenen Kontexten gleich und ich möchte Abschnitte anstelle von Kopieren und Einfügen wiederverwenden. Irgendeine Möglichkeit, dies zu tun? – mushroom

+0

Definieren Sie Ihre Methode auf der obersten Ebene der Datei, nicht innerhalb eines 'describe' oder' context' Blocks. –

Verwandte Themen