2013-09-30 2 views
5

Я видел тонны этих вопросов, но ни один из их решений не работает для меня. У меня есть один тест, например:Уровень стека слишком глубокий - 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 

Простой, простой, простой. Тем не менее, я получаю типичную ошибку:

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 

и я все как ... что? Снова я прочитал десятки вопросов по этому поводу, и это похоже на что-то с заводской девочкой, но я не могу понять, в чем проблема. У меня есть множество других тестов, которые создают объект, основанный на фабрике, подобный этому, без проблем.

+1

Как выглядит ваш стек? В любом случае вам нужно будет поделиться своими заводами, чтобы получить более конкретную помощь, чем в связанных вопросах. –

+2

Будьте осторожны с 'let' - это лениво. Когда ваш тест запускает 'sign_in admin', он будет создавать экземпляр' admin' перед запуском теста, но не 'user' или' adminRole'. – zetetic

+0

Это не похоже на Rspec. Я получил ту же ошибку в той же строке инструментария ActiveSupport, которая запускала сценарий в режиме производства, а Rspec исключался из этой среды. Я также запускаю Ruby 2.0.0-p247 и Rails 4. –

ответ

-1

Я думаю, что некоторые конфликты имен, вызывающие слишком высокий уровень уровня стека.

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

Как насчет переименования adminRole фабрику :admin_role:

factory :admin_role do 
    ... 
end 

И изменить let следовать variable convention:

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

Надеется, что это может помочь вам.

+0

Downvoting, потому что упоминание соглашений об именах не помогает в решении проблемы. –

1

Просто не используйте переменную, которую вы определяете с помощью let внутри следующего блока кода, поскольку она вызывает бесконечную рекурсию.

Смежные вопросы