11

RSpec(最新バージョン、2.12.2)を使用して、作業中の小さなRubyクラスをテストしています。私の問題は、RSpecテストが失敗すると、テスト出力が非常に冗長に見え、エラーメッセージの膨大なリストが表示されることです。これは、ほぼ完全なバックトレースのようです。これは、実際のエラーメッセージとトレースの先頭を表示するために上にスクロールする必要があることを意味します。

デフォルトではRSpecがこれを行うことになっていると思いますが、私にとってはそうではないようです。たとえば、実行するとrspec spec/my_spec.rb:132(L132で1つのテストを実行するだけ)、次の出力が得られます。

 Failure/Error: @f.has_changed?("test").should be_true
   expected: true value
        got: false
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/fail_with.rb:33:in `fail_with'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/handler.rb:33:in `handle_matcher'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/syntax.rb:53:in `should'
 # /Users/JackFranklin/Dropbox/Sites/rubygems/filefixtures/spec/filefixtures_spec.rb:137:in `block (4 levels) in <top (required)>'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:114:in `instance_eval'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:114:in `block in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:254:in `with_around_each_hooks'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:111:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:388:in `block in run_examples'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:384:in `map'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:384:in `run_examples'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:369:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `block in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `map'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `block in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `map'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `block (2 levels) in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `map'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `block in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/reporter.rb:34:in `report'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:25:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/runner.rb:80:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/runner.rb:17:in `block in autorun'

ご覧のとおり、これは絶対に巨大です。RSpecに渡される構成を変更する可能性のあるRSpec構成ファイルがありません。

誰かがこれを見たことがありますか?グーグルを試しましたが、検索は効果がありませんでした。

編集:次に、構成を設定して、デフォルトのバックトレースクリーニングが適用されていることを確認します。

RSpec.configure do |config|
  # RSpec automatically cleans stuff out of backtraces;
  # sometimes this is annoying when trying to debug something e.g. a gem
  config.backtrace_clean_patterns = [
    /\/lib\d*\/ruby\//,
    /bin\//,
    /gems/,
    /spec\/spec_helper\.rb/,
    /lib\/rspec\/(core|expectations|matchers|mocks)/
  ]
end

しかし、これは違いを生みません。出力を見ると、ほとんどがフィルターで除外されているはずですが、構成が適用されていないようです。

もう一度編集します。

私の設定ではcleaned_from_backtrace?(line)、行をクリーンアップする必要があるかどうかを確認するために実行することもできます。これは次を返しますtrue

 config.cleaned_from_backtrace?("/Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/fail_with.rb:33:in `fail_with'")

しかし、ターミナルでの実際の出力は同じままです!

編集3:

コマンドを使用してRSpecを実行していますが、rspecそれ以上は実行していません。プロジェクトの.rspecファイルには次のものが含まれます。

--color
--format progress

また、~/.rspec設定を適用している可能性のあるファイルもありません。

4

4 に答える 4

12

そのため、GithubでRSpecの人々ともう少しチャットした後、私はなんとか問題を突き止めることができました。

問題は、デフォルトで、RSpecが正規表現/gems/に一致する行をバックトレースから削除することでした。私はプロジェクトをgems次の名前のフォルダー内に持っていた~/Dropbox/rubygems/myprojectので、バックトレースのすべての行が削除されていました。それが発生すると、RSpecはバックトレース全体を適切に表示します。

それは私が見ていた行動を説明しています。

それはいつもそのようなばかげたものです。他の誰かがこれを行うなら、おそらくこの答えが彼らの時間を節約することを願っています。

于 2012-12-21T20:16:48.420 に答える
3

-b完全なバックトレースのために、を使用してRSpecを実行しているように見えます。通常、RSpecは、テストがひどく失敗した場合でも(つまり、アサーションに失敗しただけでなく、例外をスローした場合でも)、そのような独自の内部バックトレースを表示しません。-bまたはを使用して明示的に実行していない場合は、構成ファイルに--backtraceその設定が設定されていないこと.rspec、またはIDEなどがそれを渡していないことを確認してください。

于 2012-12-21T01:15:38.570 に答える
1

ジムが言ったように、完全なバックトレースを有効にする-bまたは--backtraceオプションがあります。.rspecそれをトリガーする可能性があるのはファイルだけではないことに注意してください。~/.rspec(開発者の好みのオプション用に)もあります。

覚えておくべきもう1つのことは、フォーマッターがバックトレースの必要な部分を吐き出すことができるということです。フォーマッターは、サードパーティのフォーマッターがバックトレースフィルタリング構成を尊重するための簡単な方法を公開しますが、サードパーティのフォーマッターを使用している場合、それが適切に使用されている保証はありません。組み込みのrspecフォーマッタの1つを使用していますか?

最後に、それがそれらの1つでない場合、私はアイデアがありません。私はあなたの質問に答えるために遊ぶための例を持っている必要があります。再現可能な例を思い付くことができますか(要点として、うまくいけば)?私はirc.freenode.netのrspecチャネルに定期的にたむろしているので、そこで私を捕まえることができ、その方法でトラブルシューティングを行うことができます。

于 2012-12-21T01:49:50.770 に答える
1

バージョン3.4.0/2015-11-11から、オプションでバックトレースをフィルタリングすることが可能です。

RSpec.configure do |config|
   config.filter_rails_from_backtrace!
end
于 2017-10-07T19:38:21.273 に答える