1

我试图用 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

还有我在 spec_helper.rb 中的 RSpec 部分:

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”。

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

4

2 回答 2

5

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

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

例如,这段代码会导致堆栈溢出:

def recursive_method
  recursive_method
end

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

如果这不能为您指明正确的方向,您可能会被迫逐步恢复最近的代码更改,直到问题消失。当您回到代码中问题消失的状态时,您会知道问题与更改有关,尽管具体细节可能不会立即清楚。

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

于 2011-12-05T21:55:03.777 回答
0

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

rspec --backtrace 
于 2021-03-01T04:57:52.653 回答