RSpec没有给我任何回溯

时间:2011-12-05 21:02:29

标签: ruby-on-rails ruby-on-rails-3 rspec rspec2 backtrace

我试图通过rspec获得回溯,但由于某种原因我无法使其工作。

这是测试文件:

require 'spec_helper'

describe ActivityReport do
  it "should create a new instance given valid attributes" do
  activity = Factory(:activity_report)
end

这是我运行的命令:

rspec --backtrace spec/models/activity_report_spec.rb

这就是我得到的:

No examples matched {:focus=>true}. Running all.

ActivityReport
  should create a new instance given valid attributes (FAILED - 1)

Failures:

  1) ActivityReport should create a new instance given valid attributes
     Failure/Error: Unable to find matching line from backtrace
     SystemStackError:
       stack level too deep
     # /Users/pbartels/.rvm/gems/ruby-1.9.2-p290@brothelking/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:206

Finished in 40.76 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/models/activity_report_spec.rb:16 # ActivityReport should create a new instance given valid attributes

我的.rspec:

--format nested
--color
--drb
--backtrace

我的RSpec部分在spec_helper.rb中:

ENV["RAILS_ENV"] ||= 'test'

require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'factory_girl'
require 'database_cleaner'
require 'active_record/fixtures'

DatabaseCleaner.strategy = :truncation
DatabaseCleaner.start

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  config.mock_with :rspec

  config.use_transactional_fixtures = true

  config.treat_symbols_as_metadata_keys_with_true_values = true  
  config.filter_run :focus => true  
  config.run_all_when_everything_filtered = true

  config.backtrace_clean_patterns = [
    /\/lib\d*\/ruby\//,
    /bin\//,
    #/gems/,
    /spec\/spec_helper\.rb/,
    /lib\/rspec\/(core|expectations|matchers|mocks)/
  ]
end

我尝试使用和不使用“backtrace_clean_patterns”。

有人知道这里有什么问题吗?

2 个答案:

答案 0 :(得分:5)

没有回溯,因为它不是给定的代码行失败,它实际上是代码的结构。 ruby解释器实际上没有空间来存储堆栈上的进一步方法调用。

Stack level too deep通常意味着你最近添加/修改了自己调用的代码,然后进入一个无限递归的黑洞。查看您最近添加的代码(包括测试)以获取线索。看看你是否从内部调用了一个方法。

例如,此代码将导致堆栈溢出:

def recursive_method
  recursive_method
end

你可能有一个共享方法名称的方法调用或字段,当你引用它时,它会进入这个无限循环/递归调用。

如果这不能指向正确的方向,则可能会强制您逐步恢复最近的代码更改,直到问题消失为止。当您回到代码中问题消失的状态时,您会发现该问题与 更改有关,但具体情况可能不会立即显示。

另一种选择,如果你真的没有得到它(或者以智能方式还原变化是不可行的),就是开始在你怀疑问题的代码中添加调试行。不知何故,你需要让你的应用程序写入日志文件或其他东西,以便你可以在它死之前弄清楚它正在做什么。

答案 1 :(得分:0)

对于来到这里寻找如何使用跟踪运行 rspec 的任何人来说,

rspec --backtrace