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后立即发生错误
我使用找到了原因
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
我觉得它们确实是查明此类问题根源的有力选择。
归档时间: |
|
查看次数: |
4298 次 |
最近记录: |