当我单独运行我的型号规格和控制器规格时,它没问题。当我一起运行它们时,我得到一个堆栈溢出,字面意思是:)
$ 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
我怎么开始调试这个?感谢。
答案 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)
我会从代码中关键点的puts
或raise
语句开始,这样您就可以开始缩小导致问题的那一行。一旦你开始接近,你可以一次注释掉一行来找出问题消失的那一行 - 一旦你把它归结为一行,你就可以弄清楚那行是做什么的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)}