2011-11-27 6 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]3/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

[फैक्ट्रीगर्ल एसोसिएशन मॉडल परेशानी का संभावित डुप्लिकेट: "सिस्टमस्टैक त्रुटि: ढेर स्तर बहुत गहरा"] (http://stackoverflow.com/questions/7479031/factorygirl-association-model-rourouble-sstemstackerror-stack-level-too- गहरा) –

उत्तर

20

समस्या लाइन यह है:

@user = Factory(:user) 

आप एक परिपत्र संदर्भ है: अपने :user कारखाने एक :role और :admin कारखाने पैदा करता है। फिर :role और :admin फैक्ट्रियां प्रत्येक :user फैक्ट्री बनाती हैं, जो तब एक और :role और :admin फैक्ट्री बनाती है, और तब तक जब तक आपको स्टैक स्तर बहुत गहरी त्रुटि नहीं मिल जाती।

आपको इनमें से कुछ से एसोसिएशन को हटाने की आवश्यकता होगी। मैं और :admin दोनों से role.association लाइनों को हटाने की अनुशंसा करता हूं। जब भी आप :user बनाते हैं, तो यह अभी भी आपके लिए :role और :admin लाइनें बनाएगा।

+0

धन्यवाद डिलन, मैं लूप समस्या को समझता हूं, लेकिन अब मैं अपनी पुरानी त्रुटि वापस प्राप्त कर रहा हूं 'NoMethodError: # <उपयोगकर्ता: 0x00000104bae6b8> 'के लिए अपरिभाषित विधि' role = '। कम से कम मैं लूप को समझता हूं जो बनाया गया था :)। –