2011-11-04 2 views
1

Pour un test de contrôleur, en haut de la spécification que je suis la définition des modèles:Rspec obtenir « niveau de la pile trop profond » des associations

let(:user) { Factory(:user, :company => company) } 
    let(:facility) { Factory(:facility, :company => company) } 
    let(:company) { Factory(:company, :facilities => [facility]) } 

Et faire la spécification de l'indice de base:

context "responding to GET index" do 
    it "should expose all facilities as @facilities" do 
     user.company.should_receive(:facilities).and_return([facility]) 
     get :index 
     assigns[:facilities].should == [facility] 
    end 
    end 

Mais j'obtiens cette erreur:

should expose all facilities as @facilities 
stack level too deep 
/Users/dmix/.rvm/gems/ruby-1.9.3-p0/gems/rspec-core-2.6.4/lib/rspec/core/let.rb:90 
88  module InstanceMethods 
89  def __memoized # :nodoc: 
90   @__memoized ||= {} 
91  end 
92  end 

le problème semble référencer les 3 usines en même temps.

Si je supprime les installations: de la définition de l'usine de l'entreprise, l'erreur de la pile va bien:

let(:company) { Factory(:company) } 

Comment puis-je usine trois modèles que toute référence sans se faire un stackoverflow?

Répondre

2

Le problème est que vos objets facility et company se réfèrent mutuellement. Je pense que la partie :facilities => [facility] de votre usine company peut être inutile, puisque vous désignez déjà la société de l'objet facility comme company. Essayez ceci:

let(:facility) { Factory(:facility, :company => company) } 
let(:company) { Factory(:company) } 
+0

qui corrige en effet la pile d'erreurs trop profond, mais il casse les tests tels que: user.company.should_receive (: installations) .and_return ([établissement]) – dMix

+0

Dans le test après la création de l'usine, pouvez-vous simplement attribuer l'installation à l'entreprise? – jaydel

Questions connexes