2012-12-27 13 views
5

Próbuję ponownie użyć jakiegoś wspólnego kodu w specyfikacji kontrolera szyn. Mam różne konteksty dla administratorów i zwykłych użytkowników. Jednak wiele z zachowań jest taka sama dla poszczególnych działań, więc próbowałem ciągnąc to wspólne zachowanie się do funkcji pomocniczych:Ponowne użycie kodu w różnych kontekstach rspec

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 

To daje mi błąd:

undefined local variable or method `common_get_new'

Co robię źle?

+0

Co to jest common_get_new - rzeczy instalacyjne, połączenia z powinienem, całe przykłady, coś innego? –

+0

@FrederickCheung Nie zawiera rzeczy instalacyjnych. Zawiera kilka pełnych przykładów. – mushroom

Odpowiedz

13

próbowałeś za pomocą Shared Examples?

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 

W zależności od tego, co jest w swojej metody w swoim pytaniu common_get_new, aby po prostu pozbyć się błędów, można umieścić metody w specyfikacji/support/utilities.rb, czy jako @Chris Heald zasugerował i zdefiniował metodę na górze pliku.

+0

Dzięki za wskazówkę na spec/support/utilities.rb! –

+0

Jeśli ktoś szuka sposobu przekazania parametru do współużytkowanego przykładu: 'shared_examples_for" common_perf_test "do | imię i nazwisko, wiadomość | ' ' puts "# {name}" ', a następnie wywołaj udostępniony przykład w następujący sposób: ' it_should_behave_like "common_perf_test", "# {description}", wiadomość' –

0

Spróbuj rozmieszczanie swoich kontekstów tak że głębsze konteksty mogą dzielić ten sam kod instalacyjny:

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

Mój problem polega na tym, że rzeczy, których jestem faktem, nie są tak naprawdę pracą instalacyjną. Poszczególne sekcje specyfikacji są takie same w różnych kontekstach i chcę ponownie wykorzystać sekcje, a nie kopiować i wklejać. Jakikolwiek sposób to zrobić? – mushroom

+0

Zdefiniuj swoją metodę na najwyższym poziomie pliku, a nie wewnątrz bloku 'opis' lub' kontekstu '. –

Powiązane problemy