rspec堆栈级别太深

当我单独运行我的模型规格和控制器规格时,它没问题。 当我一起运行它们时,我得到一个堆栈溢出,字面意思:)

$ bundle exec rspec --fail-fast spec/models ........ Finished in 0.44274 seconds 8 examples, 0 failures $ bundle exec rspec --fail-fast spec/controllers .. Finished in 0.99339 seconds 2 examples, 0 failures $ bundle exec rspec --fail-fast spec F Failures: 1) HerpController derp derp example Failure/Error: Unable to find matching line from backtrace SystemStackError: stack level too deep # /Users/jared/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.2.1/lib/abstract_controller/layouts.rb:359 Finished in 0.02241 seconds 1 example, 1 failure 

我怎么开始调试这个? 谢谢。

一次删除一半我的规格出现了问题。 我想这是bisect调试的一个例子。 感谢Frederick Cheung,他的评论提出了这种方法。

对后人来说,这就是问题所在。

 include Rails.application.routes.url_helpers describe "Attendee#next_page" do end 

显然,包括进入describe

 describe "Attendee#next_page" do include Rails.application.routes.url_helpers end 

我有很多关于rspec的知识。 🙂

您可以在代码中放置一个debugger语句并以这种方式进行调试,或者只是在您知道正在运行的代码的位置开始使用puts "got here" 。 我建议使用有意义的东西,而不是“到这里”:-)

我会在代码的关键点开始使用putsraise语句,这样你就可以开始缩小导致问题的那一行。 一旦你开始接近,你可以一次注释掉一行来找出问题消失的那一行 – 一旦你把它弄到一行,你就可以弄清楚那行是做什么的Ruby没有不喜欢。

一般来说,从哪里开始,“堆栈级别太深”通常是无限循环或无限递归问题 – 我想象有一些模型正在调用调用模型的控制器,反之亦然。 在你开始评论线路之前无法确切知道,但任何有函数调用的地方都属于你可疑的短名单。 祝好运!

可能你可以得到“无法找到来自backtrace的匹配行”错误,以防你检查一些实际上没有初始化的var

在此示例中,请注意未在错误的代码段中初始化的var 观察

错误的片段

 describe "GET index" do it "assigns all observations as @observations" do get :index, {}, valid_session assigns(:observations).should eq([observation]) end end 

固定的例子 (第3行)

 describe "GET index" do it "assigns all observations as @observations" do observation = Observation.create! valid_attributes get :index, {}, valid_session assigns(:observations).should eq([observation]) end end 

有时我们依赖于使用let作为初始化程序,但忘记添加它,例如

 let(:observation) {FactoryGirl.create(:observation)}