2012-02-19 8 views
13

Rubyコードをテストしていて、失敗したTest :: Unit :: TestCaseを持っています。残念なことに、失敗レポートでは、完全なスタックトレースではなく、一番上のエラーだけが表示されます。具体的には、それは言う:Test :: Unit :: TestCaseからスタックトレースを取得する方法

1) Failure: 
test_tp_make(TestScripts::TestTpMake) [test/test_scripts.rb:73]: 
Exception raised: 
<#<NoMethodError: undefined method `[]' for nil:NilClass>>. 

参照の行番号(73)が順番に順番に大規模なライブラリへのコール別のコードブロックを、開始私のテストケースでassert_nothing_raisedコードブロックの開始です。

私はこのテストを--verboseフラグで実行しようとしましたが、残念ながらこれは例外出力を変更しません。私はTest :: Unitのドキュメントを調べてみましたが、利用可能なオプションを列挙していないようです(例えば、有用なものはありません。here)。 WebとStackOverflowを検索すると、Railsでスタックトレースを有効にする方法に関するいくつかの回答が浮上しましたが、これはRails以外のルビコードです。

テストから失敗したコードを抽出してTest :: Unitの外で実行すると、すべての出力を見ることができます。しかし、私は失敗したテストがあるたびにこれを行うのは苦痛です。

誰かが私に完全なスタックトレースを与えるTest :: Unitを取得する方法を知っていますか?

+0

あなたは 'rake'でテストを実行していますか? – Casper

+0

いいえ、すくいが走っていません。 –

+0

これはRuby 1.8、Ruby 1.9、またはその両方にありましたか? –

答えて

14

Ruby 1.8でTest :: Unitのコードを調べると、#long_displayメソッドでバックトレースをフィルタリングするTest :: Unit :: Errorオブジェクトがすべてエラーになるようです。構成はなく、すべてのランナーは同じフィルターされたトレースを使用します。

ブルートフォースモンキーパッチ全体のトレースを取得するには:(私は単一のテストケースファイルにこれを入れ、おそらくあなたがテストヘルパーにそれを置くことができ)Ruby 1.9のための

require 'test/unit/util/backtracefilter' 

module Test::Unit::Util::BacktraceFilter 
    def filter_backtrace(backtrace, prefix=nil) 
    backtrace 
    end 
end 

そしてモンキーパッチ(

def MiniTest.filter_backtrace(bt) 
    bt 
end 
+0

+1あなたは私の命を救った! _(または少なくとも正気性)_ :-) – Arsen7

1

完全なスタックトレースを取得するには、このクラスをどこでも使用します。私は私のテストクラスをデバッグするために私のユニットテストケースでそれを使用しました。

rescue => e 

puts e.inspect 

puts e.backtrace 
+0

あなたの解決策はOKですが、問題はTest :: Unitの存在の必要性を否定することです。手動ですべての例外をトレースすることをお勧めします。問題は、Test :: Unitをもう一度役に立つように修正する方法でした。 – Arsen7

関連する問題