当使用rspec和黄瓜与ruby和rails时,堆栈级别太深(SystemStackError)

Per*_*ich 5 ruby debugging rspec cucumber ruby-on-rails-3

这是一个关于在使用Ruby和Rails遇到堆栈级别太深(SystemStackError)时应该使用什么调试策略的问题.

我在使用rspec或黄瓜时看到这些错误

perrys-MacBook-Pro:pc perry_mac$ cucumber
stack level too deep (SystemStackError)
/Users/perry_mac/.rvm/gems/ruby-1.9.3-p327/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:240  

perrys-MacBook-Pro:pc perry_mac$ rspec
/Users/perry_mac/.rvm/gems/ruby-1.9.3-p327/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:240: stack level too deep (SystemStackError)
perrys-MacBook-Pro:pc perry_mac$ 
Run Code Online (Sandbox Code Playgroud)

我怀疑我在这里介绍的问题与rspec和黄瓜无关.我不确定如何缩小问题范围.我接下来应该尝试什么?

我已经尝试过bundle update,运行正常.

该应用运行良好rails s,但我想利用我写的rspec和黄瓜测试.

附录:

我用最简单的测试看到了这一点,例如:

perrys-MacBook-Pro:pc perry_mac$ cat ./spec/controllers/page_controller_spec.rb
require 'spec_helper'

describe PageController do

end
perrys-MacBook-Pro:pc perry_mac$ rspec ./spec/controllers/page_controller_spec.rb
/Users/perry_mac/.rvm/gems/ruby-1.9.3-p327/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:240: stack level too deep (SystemStackError)
perrys-MacBook-Pro:pc perry_mac$ 
Run Code Online (Sandbox Code Playgroud)

附录2:spec_helper的pastebin在这里:http://pastebin.com/ePdGyHQh

附录3:Gemfile的pastebin在这里:http://pastebin.com/xkLYGjsY

附录4:我已经确定这是spec_helper.rb中导致错误的行

require File.expand_path("../../config/environment", __FILE__)
Run Code Online (Sandbox Code Playgroud)

如果我在该行之前放置了故意的语法错误,我会得到'语法错误'如果我在行之后输入相同的语法错误,我会得到'堆栈太深的错误'.

似乎有些进步.应该require File.expand_path("../../config/environment", __FILE__)写一些其他方式?

附录5:我将此添加到spec_helper.rb:

puts File.path("../../config/environment") 
puts __FILE__
require File.expand_path("../../config/environment", __FILE__)
Run Code Online (Sandbox Code Playgroud)

现在看到这个:

perrys-MacBook-Pro:pc perry_mac$ rspec ./spec/controllers/page_controller_spec.rb
../../config/environment
/Users/perry_mac/rails_projects/pc/spec/spec_helper.rb
/Users/perry_mac/.rvm/gems/ruby-1.9.3-p327/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:240: stack level too deep (SystemStackError)
perrys-MacBook-Pro:pc perry_mac$ 
Run Code Online (Sandbox Code Playgroud)

......但我不确定产出的含义是什么.

附录6:
使用pry,我逐步完成了代码.在失败之前输出的pastebin在这里:http://pastebin.com/c6ZfPmVn 这有用还是我应该包含其他内容?看起来执行一直持续到这一点:

/Users/perry_mac/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.13.1/lib/rspec/core.rb @ line 69 RSpec.reset
Run Code Online (Sandbox Code Playgroud)

附录7:我刚刚确认我可以检查出一个运行rspec和黄瓜的旧git分支.有一个工作分支可以帮我调试最近破碎的分支吗?

附录8:根据Pry执行跟踪,在调用Rspec.reset后立即发生错误

Per*_*ich 1

我使用找到了原因

git bisect
Run Code Online (Sandbox Code Playgroud)

git show [commitID]
Run Code Online (Sandbox Code Playgroud)

我能够返回我的提交日志并找到一个工作版本。git bisect 然后,使用此处的说明,我能够找到引入堆栈太深错误的提交。然后我经常git show [commitID]看到两行可能是罪魁祸首的代码。他们是:

# file:app/controllers/thisControllerFileIhave.rb

require 'dicom'
include DICOM
Run Code Online (Sandbox Code Playgroud)

进行此更改似乎解决了问题:

require 'dicom'
#include DICOM
Run Code Online (Sandbox Code Playgroud)

老实说,我不记得为什么添加“include DICOM”(提交于 2012 年 10 月),也不明白为什么或如何这会导致 rspec 和 cucumber 如此引人注目和神秘地失败。我也不明白如何rails s在这段代码下运行应用程序,但测试套件却不能。我会感谢建议的发帖者git bisect,但他们的评论似乎已被删除。

我针对这个问题得到的大多数答案和评论并没有直接涉及调试策略,而是提供了作者何时看到并纠正这样的错误的第一手资料。我很高兴能遇到这样的问题git bisect,而且git show我觉得它们确实是查明此类问题根源的有力选择。