2011-11-27 10 views
9

私は私のスペックのテストで問題を解決しようとしていると私は次のようなエラーに 障害取得:これに先立ちRSPECと工場の女の子SystemStackError:スタックレベルが深すぎ

1) SessionsController POST 'create' with valid email and password should sign in the user 
    Failure/Error: Unable to find matching line from backtrace 
    SystemStackError: 
     stack level too deep 
    # /Users/Aurelien/.rvm/gems/[email protected]/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_specification.rb:103 

Finished in 37.77 seconds 
9 examples, 1 failure 

Failed examples: 

rspec ./spec/controllers/sessions_controller_spec.rb:35 # SessionsController POST 'create' with valid email and password should sign in the user 

を私はとの関連で問題がありました工場。

Factory.define :role do |role| 
    role.name     "Registered" 
    role.association :user, :factory => :user 
end 

Factory.define :admin do |role| 
    role.name     "Admin" 
    role.association :user, :factory => :user 
end 

Factory.define :user do |user| 
    user.first_name    "Foo" 
    user.last_name    "Bar" 
    user.email     "[email protected]" 
    user.password    "foobar" 
    user.password_confirmation "foobar" 
    user.status     "At foobar" 
    user.description   "Lorem Ipsum sit dolor amet." 
    user.username    "foobar" 
    user.association :role, :factory => :role 
    user.association :admin, :factory => :role 
end 

Factory.define :user_with_admin_role, :parent => :user do |user| 
    user.after_create { |u| Factory(:role, :user => u) } 
end 

Factory.define :reg_user do |user| 
    user.first_name    "bar" 
    user.last_name    "foo" 
    user.email     "[email protected]" 
    user.password    "foobar" 
    user.password_confirmation "foobar" 
    user.status     "At foobar" 
    user.description   "Lorem Ipsum sit dolor amet." 
    user.username    "barfoo" 
    user.association :role, :factory => :role 
end 

と私のセッションのテストはこれまでのところ、次のとおりです。

describe "POST 'create'" do 
    describe "invalid signin" do 
     before(:each) do 
     @attr = { :email => "[email protected]", :password => "invalid" } 
     end 

     it "should re-render the 'new' page with a flash error" do 
     post :create, :session => @attr 
     flash.now[:error] =~ /invalid/i 
     response.should render_template('new') 
     end 

    end 

    describe "with valid email and password" do 

     before(:each) do 
     @user = Factory(:user) 
     @attr = { :email => @user.email, :password => @user.password} 
     end 

     it "should sign in the user" do 
     post :create, :session => @attr 
     controller.current_user.should == @user 
     end 

    end 

    end 

私は本当に問題を作成しているかわからないです。 私のモデルでは、すべてのユーザーにデフォルトの役割を「登録済み」とし、最初のユーザーの「管理者」役割として割り当てます。

user.rb

def assign_default_role 
    if User.count == 0 
     self.roles << Role.find_by_name("Admin") 
     self.roles << Role.find_by_name("Registered") 
    end 
    self.roles << Role.find_by_name("Registered") unless User.count == 0 
    end 

任意のアドバイスは最も歓迎されるであろう。 おかげ

+0

[FactoryGirlアソシエーションモデルの問題の重複: "SystemStackError:スタックレベルが深すぎます"](http://stackoverflow.com/questions/7479031/factorygirl-association-model-trouble-systemstackerror-stack-level-too-深い) –

答えて

20

は、問題の行はこれです:

@user = Factory(:user) 

あなたは循環参照を持っている:あなたの:user工場は:role:admin工場を作成します。次に:role:adminファクトリはそれぞれ別の:userファクトリを作成し、ファクトリを:role:adminにさらに作成します。スタックレベルが深すぎるとエラーが発生します。

これらのいくつかの関連付けを削除する必要があります。 :role:adminの両方のrole.association行を削除することをおすすめします。 :userを作成するたびに、:role:admin行が作成されます。

+0

Dylanさん、ありがとう、私はループの問題を理解していますが、私は以前のエラー 'NoMethodError: ' のために 'role = 'を未定義に戻しています。少なくとも私は作成されたループを理解しています:)。 –

関連する問題