2012-12-27 15 views
5

Sto tentando di riutilizzare un codice comune in una specifica del controller di rotaia. Ho contesti diversi per gli utenti amministratori e gli utenti regolari. Tuttavia, gran parte del comportamento è lo stesso per le azioni particolari, così ho cercato di trazione che il comportamento comune fuori in una funzione di supporto:Riutilizzo del codice in diversi contesti 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 

Questo mi dà l'errore:

undefined local variable or method `common_get_new'

Che cosa sto facendo sbagliato?

+0

Che cosa è common_get_new - roba di installazione, chiamate a dovrebbe, interi esempi, qualcos'altro? –

+0

@FrederickCheung Non contiene materiale di installazione. Ha diversi interi esempi in esso. – mushroom

risposta

13

Hai provato a usare 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 

A seconda di ciò che è nel tuo metodo common_get_new nella sua interrogazione, al fine di ottenere semplicemente liberarsi del vostro errore, si potrebbe mettere il metodo in spec/supporto/utilities.rb, o fare come @ Chris Heald ha suggerito e definito il metodo nella parte superiore del file.

+0

Grazie per il suggerimento su spec/support/utilities.rb! –

+0

Se qualcuno sta cercando un modo per passare un parametro in un esempio condiviso: 'shared_examples_for" common_perf_test "fare | nome, messaggio | ' ' inserisce "# {nome}" ', quindi richiama l'esempio condiviso come segue: ' it_should_behave_like "common_perf_test", "# {description}", message' –

0

Prova riorganizzare i vostri contesti in modo che i contesti più profondi possono condividere lo stesso codice di impostazione:

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

Il mio problema con questo è che le cose che sto prendendo in considerazione non sono davvero un lavoro di installazione. Particolari sezioni delle specifiche sono le stesse in diversi contesti e voglio riutilizzare sezioni piuttosto che copiare e incollare. Un modo per farlo? – mushroom

+0

Definisci il tuo metodo al livello più alto del file, non all'interno di un blocco 'describe' o' context'. –