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

おそらく、メソッドの名前を共有するメソッド呼び出しまたはフィールドがあり、それを参照すると、この無限ループ/再帰呼び出しに入ります。

それが正しい方向に向かない場合は、問題が解決するまで、最近のコード変更を段階的に元に戻さなければならない場合があります。問題が解消されたコードの状態に戻ると、問題がその変更に関係していることがわかりますが、詳細はすぐには明らかにならない場合があります。

もう 1 つのオプションは、それで本当にうまくいかない場合 (または、インテリジェントな方法で変更を元に戻すことができない場合) は、問題があると思われるコードにデバッグ行を追加することです。どういうわけか、アプリケーションがログ ファイルなどに書き込むようにする必要があります。これにより、終了する直前にアプリケーションが何をしているのかを把握できます。

于 2011-12-05T21:55:03.777 に答える