2011-11-04 49 views
1

对于控制器测试,在我定义的模型规范的顶部:Rspec的越来越“堆栈层次过深,”从协会

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

,并做基本指标规格:

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 

但我发现了这个错误:

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 

这个问题似乎在同一时间被引用的3家工厂。

如果我删除:从公司工厂定义设施,堆栈错误去的方式:

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

我怎么厂三个型号,所有没有得到一个计算器相互引用?

回答

2

问题是您的facilitycompany对象互相引用。我认为您的company工厂的:facilities => [facility]部分可能是不必要的,因为您已指定facility对象的公司为company。试试这个:

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

那的确修复了堆太深的错误,但它打破了测试,如:user.company.should_receive(:设施).and_return([工具]) – dMix

+0

在工厂创建测试后,你能简单地将设施分配给公司吗? – jaydel