繁体   English   中英

rspec堆栈级别太深

[英]rspec stack level too deep

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

$ 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" 我建议使用有意义的东西,而不是“到这里”:-)

可能你可以得到“无法找到来自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)}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM