rspec堆栈级别太深

问题描述:

当我分别运行我的模型规格和控制器规格时,它很好。当我将它们放在一起运行时,出现堆栈溢出,字面意思:)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 

我该如何开始调试?谢谢。

+3

我会随机删除一半的控制器/型号规格,看看问题是否仍然存在。如果有,请删除更多控制器规格。如果没有,那么恢复您移除的规格并移除最初留下的规格。重复,直到你把它缩小到一个特定的规格集 – 2012-02-12 15:16:22

一次性移除我的一半规格后出现问题。我想这是一个平分调试的例子。感谢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的内部。 :)

+0

还是很有帮助的(2017),谢谢! – 2017-10-05 04:20:35

+0

对于那些希望追求平分调试方法的人,您可能会发现'rspec --bisect'有帮助:https://relishapp.com/rspec/rspec-core/docs/command-line/bisect – 2018-02-20 06:24:34

您可以将debugger语句放入您的代码并以此方式进行调试,或者仅在代码的正在运行的位置开始使用puts "got here"。我会建议使用一些有意义的事情,而不是“来到这里”太:-)

+0

这个'puts'技术也是我使用的,我必须说它必须是最被低估的调试方式! – 2014-06-10 12:34:49

我开始要么在你的代码的关键点putsraise语句,这样你就可以开始缩小哪一行导致了问题。一旦你开始接近,你可以一次注释掉一行,找出问题消失的路线 - 只要你把它放到一行,你就可以知道那行代码是Ruby做的事情不喜欢。

关于从哪里开始的一般术语来说,“堆栈级别太深”通常是无限循环或无限递归问题 - 我想象一下,模型调用控制器调用模型时会发生什么,或者反之亦然。没有办法知道肯定,直到你开始注释行,但任何地方你有函数调用将属于你的可疑短名单。祝你好运!

也许你可以得到“无法找到匹配回溯线”的情况下,错误要检查一些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(:observation) {FactoryGirl.create(:observation)}