2011-11-27 10 views
9

Tôi đã cố gắng để giải quyết một vấn đề với các bài kiểm tra Spec của tôi và tôi nhận được lỗi thất bại sau:RSpec và nhà máy cô gái SystemStackError: ngăn xếp mức quá sâu

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 

Trước đó tôi đã có vấn đề với các hiệp hội với tôi nhà máy.

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]r.com" 
    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 

và kiểm tra phiên của tôi cho đến nay là:

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 

Tôi thực sự không chắc chắn những gì đang tạo ra vấn đề. Trong mô hình của tôi, tôi gán vai trò mặc định cho mọi người dùng là "Đã đăng ký" và vai trò "Quản trị" cho người dùng đầu tiên.

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 

Bất kỳ tư vấn sẽ được hoan nghênh nhất. Cảm ơn

+0

Bản sao có thể có của [Sự cố mô hình liên kết FactoryGirl: "SystemStackError: cấp ngăn xếp quá sâu"] (http://stackoverflow.com/questions/7479031/factorygirl-association-model-trouble-systemstackerror-stack-level-too- sâu) –

Trả lời

20

Dòng vấn đề là thế này:

@user = Factory(:user) 

Bạn có một tham chiếu vòng tròn: nhà máy :user của bạn tạo ra một nhà máy :role:admin. Sau đó, các nhà máy :role:admin mỗi nhà máy tạo một nhà máy khác :user, sau đó tạo thêm một nhà máy khác là :role:admin, v.v. cho đến khi bạn gặp lỗi cấp độ quá cao.

Bạn sẽ cần xóa các liên kết khỏi một số trong số này. Tôi khuyên bạn nên xóa các dòng role.association khỏi cả hai số :role:admin. Bất cứ khi nào bạn tạo một :user, nó sẽ vẫn tạo ra các dòng :role:admin cho bạn.

+0

Cảm ơn bạn Dylan, tôi hiểu vấn đề vòng lặp, nhưng bây giờ tôi đang nhận lại lỗi cũ của tôi 'NoMethodError: phương thức undefined' role = 'cho # '. Ít nhất tôi hiểu vòng lặp đã được tạo :). –