我试图通过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”。
有人知道这里有什么问题吗?
答案 0 :(得分:5)
没有回溯,因为它不是给定的代码行失败,它实际上是代码的结构。 ruby解释器实际上没有空间来存储堆栈上的进一步方法调用。
Stack level too deep
通常意味着你最近添加/修改了自己调用的代码,然后进入一个无限递归的黑洞。查看您最近添加的代码(包括测试)以获取线索。看看你是否从内部调用了一个方法。
例如,此代码将导致堆栈溢出:
def recursive_method
recursive_method
end
你可能有一个共享方法名称的方法调用或字段,当你引用它时,它会进入这个无限循环/递归调用。
如果这不能指向正确的方向,则可能会强制您逐步恢复最近的代码更改,直到问题消失为止。当您回到代码中问题消失的状态时,您会发现该问题与 更改有关,但具体情况可能不会立即显示。
另一种选择,如果你真的没有得到它(或者以智能方式还原变化是不可行的),就是开始在你怀疑问题的代码中添加调试行。不知何故,你需要让你的应用程序写入日志文件或其他东西,以便你可以在它死之前弄清楚它正在做什么。
答案 1 :(得分:0)
对于来到这里寻找如何使用跟踪运行 rspec
的任何人来说,
rspec --backtrace