2013-09-30 3 views
5

Ich habe Tonnen dieser Fragen gesehen, aber keine ihrer Lösungen funktionieren für mich. Ich habe einen einzigen Test wie folgt:Stack-Ebene zu tief - 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 

Einfach, einfach, einfach. Aber ich bekomme den typischen Fehler:

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 

und ich bin alle wie ... was? Wieder habe ich Dutzende von Fragen dazu gelesen und es scheint etwas mit Fabrikmädchen zu sein, aber ich kann nicht sehen, was das Problem hier wäre. Ich habe Tonnen von anderen Tests, die Factory-Girl-basierte Objekt wie diese ohne Problem instanziiert.

+1

Wie sieht Ihr Stacktrace aus? In jedem Fall müssen Sie Ihre Fabriken freigeben, um spezifischere Hilfe als in den verwandten Fragen zu erhalten. –

+2

sei vorsichtig mit 'Let' - es ist faul. Wenn Ihr Test "sign_in admin" ausführt, instanziiert er den "admin" vor dem Ausführen des Tests, aber nicht den "user" oder "adminRole". – zetetic

+0

Es scheint nicht mit Rspec verwandt zu sein. Ich habe den gleichen Fehler in der gleichen Zeile des ActiveSupport-Geräts, wenn ich nur ein Skript im Produktionsmodus ausführe, wobei Rspec in dieser Umgebung ausgeschlossen ist. Ich laufe auch Ruby 2.0.0-p247 und Rails 4. –

Antwort

-1

Ich denke, einige Namenskonflikte verursachen diesen Stack-Level zu tief Fehler.

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

Wie über Sie die adminRole Fabrik :admin_role umbenennen:

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

Hope this Sie können helfen:

factory :admin_role do 
    ... 
end 

und ändern Sie die letvariable convention zu folgen.

+0

Downvoting, da Namenskonventionen erwähnt werden, ist nicht hilfreich bei der Lösung des Problems. –

1

Verwenden Sie die Variable, die Sie definieren, einfach nicht mit let innerhalb des folgenden Codeblocks, da sie eine endlose Rekursion auslöst.