[英]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)}
我会在代码的关键点开始使用puts
或raise
语句,这样你就可以开始缩小导致问题的那一行。 一旦你开始接近,你可以一次注释掉一行来找出问题消失的那一行 - 一旦你把它归结为一行,你就可以弄清楚那行是做什么的Ruby没有不喜欢。
一般来说,从哪里开始,“堆栈级别太深”通常是无限循环或无限递归问题 - 我想象有一些模型正在调用调用模型的控制器,反之亦然。 在你开始评论线路之前无法确切知道,但任何有功能调用的地方都属于你的可疑短名单。 祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.