rspec堆栈级别太深

时间:2012-02-12 07:01:30

标签: ruby-on-rails ruby 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

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

4 个答案:

答案 0 :(得分:10)

一次删除一半我的规格出现了问题。我想这是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的知识。 :)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如果您正在检查实际未初始化的var,可能会出现“无法找到来自backtrace的匹配行”错误

在此示例中,请注意未在错误代码段

中初始化的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(:observation) {FactoryGirl.create(:observation)}