From: Hiroharu Sugawara Date: 2002-06-20T10:58:27+09:00 Subject: [ruby-list:35410] Re: RubyUnit: Extended assert module and stacktrace すすといいます。 On Wed, 19 Jun 2002 21:25:12 +0900 "Shirai,Kaoru" wrote: >  白井です。 > > > スタックトレースが期待通りにならない、簡単かつ完全なサンプルを > > 見せてもらえませんか? > >  以下は、 assert_fail と全く同じように実装している assert_my_fail メソッ > ドを用意し、 AssertionFailedError の結果を比較しています。 > > 結果: > $ ruby test.rb > MyTest#test_my_fail F. > MyTest#test_original_fail F. > Time: 0.028523 > FAILURES!!! > Test Results: > Run: 2/2(2 asserts) Failures: 2 Errors: 0 > Failures: 2 > test.rb:7:in `assert_my_fail'(MyTest): failed > (RUNIT::AssertionFailedError) > from test.rb:18:in `test_my_fail' > from test.rb:17 > test.rb:14:in `test_original_fail'(MyTest): failed > (RUNIT::AssertionFailedError) > from test.rb:17 > $ > >   assert_fail の場合はスタックトレースがちゃんと呼び出し位置から始まって > います。しかし、 assert_my_fail を使った場合、スタックトレースが > assert_my_fail の中から始まってしまいます。 上は、RubyUnitの実装通りの動作だと思います。 例外が起こったとき、スタックトレースは TestFailure.initialize()メソッド で整形されます。 この整形は、'#{$LOADPATH}/runit/' を含む行を削除しますから、 通常は assert文を呼び出した位置の情報が残ります。 一方、'/runit/*' 以外のファイルで定義した assert文のトレース情報は取り除かれませんから、 上のように、assert文内部で起こした例外の情報が残ってしまいます。 実は、私も、元のassert文を module_evalで定義し直して、 その内部で AssertionFailErrorを発生させるようなのを書いたのですが、 トレースが`(eval)'という表示が残ってしまい、対応を思案中です。