2013-09-30 12 views
5

Ho visto tonnellate di queste domande, ma nessuna delle loro soluzioni funziona per me. Ho un singolo test in questo modo:Livello di stack troppo profondo - Rspec

describe RolesController do 
    describe "#delet" do 

    context "When the user is logged in" do 
     let(:user) {FactoryGirl.create(:user)} 
     let(:admin) {FactoryGirl.create(:admin)} 
     let(:adminRole) {FactoryGirl.create(:adminRole)} 

     it "Should allow admins to delete roles" do 
     sign_in admin 
     put :destroy, :id => adminRole.id 
     end 
    end 
    end 
end 

Semplice, semplice, semplice. Eppure ottengo l'errore tipico:

1) RolesController#delet When the user is logged in Should allow admins to delete roles 
    Failure/Error: Unable to find matching line from backtrace 
    SystemStackError: 
     stack level too deep 
    # /home/adam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.0/lib/active_support/notifications/instrumenter.rb:23 

e io sono tutto simile ... cosa? Di nuovo ho letto dozzine di domande su questo e sembra essere qualcosa con la factory girl, ma non riesco a vedere quale sarebbe il problema qui. Ho un sacco di altri test che istanziano un oggetto basato su una fabbrica come questo senza alcun problema.

+1

Che aspetto ha il tuo stacktrace? In ogni caso, dovrai condividere le tue fabbriche per ottenere un aiuto più specifico rispetto alle domande correlate. –

+2

fai attenzione con 'let' - è pigro. Quando il test esegue 'sign_in admin', istanzia l'' admin' prima dell'esecuzione del test, ma non 'user' o' adminRole'. – zetetic

+0

Non sembra essere correlato a Rspec. Ho ottenuto lo stesso errore sulla stessa linea di instrumenter di ActiveSupport eseguendo uno script solo in modalità di produzione, con Rspec escluso su quell'ambiente. Sto anche eseguendo Ruby 2.0.0-p247 e Rails 4. –

risposta

-1

Penso che alcuni conflitti di denominazione causino un errore troppo profondo a livello di stack.

let(:adminRole) { FactoryGirl.create(:adminRole) } 

ne dite si rinomina la fabbrica adminRole-:admin_role:

factory :admin_role do 
    ... 
end 

e cambiare il let da seguire variable convention:

let(:admin_role) { FactoryGirl.create(:admin_role) } 

Spero che questo può aiutare.

+0

Il downvoting perché menzionare le convenzioni di denominazione non è utile per risolvere il problema. –

1

Semplicemente non utilizzare la variabile che si sta definendo con let all'interno del seguente blocco di codice poiché attiva una ricorsione senza fine.

Problemi correlati