11

私は多かれ少なかれこのようなテストをしています:

class FormDefinitionTest < ActiveSupport::TestCase
  context "a form_definition" do
    setup do
      @definition = SeedData.form_definition
      # ...

わざと追加しました

raise "blah"

どこかでこのエラーが発生します:

RuntimeError: blah
test/unit/form_definition_test.rb:79:in `__bind_1290079321_362430'

私が何かをうまくやっていくべきとき:

/Users/pupeno/projectx/db/seed/sheet_definitions.rb:17:in `sheet_definition': blah (RuntimeError)
    from /Users/pupeno/projectx/db/seed/form_definitions.rb:4:in `form_definition'
    from /Users/pupeno/projectx/test/unit/form_definition_test.rb:79

私のバックトレースをサニタイズ/破壊しているアイデアはありますか?私の疑わしいのはshouldaです。これは、例外がセットアップ内で発生した場合、または例外が発生した場合に発生するためです。

重要な場合に備えて、これはRails3プロジェクトです。

4

3 に答える 3

1

これは、shoulda メソッド#contextがコードを生成しているためです。ブロックごと#shouldに、完全に個別のテストが生成されます。

class FormDefinitionTest < ActiveSupport::TestCase
  context "a form_definition" do
    setup do
      @definition = SeedData.form_definition
    end

    should "verify some condition" do
      assert something
    end

    should "verify some other condition" do
      assert something_else
    end
  end
end

次に#should、2 つの完全に独立したテスト ( の 2 つの呼び出しに対して#should)を生成します。

      @definition = SeedData.form_definition
      assert something

そして実行する別のもの

      @definition = SeedData.form_definition
      assert something_else

3 つのステップすべてを順番に実行する 1 つのテストを生成しないことに注意してください。

これらの生成されたコードのブロックには_bind_何かのようなメソッド名があり、生成されたテストには、ブロックにトラバースされたすべてのコンテキストの名前とshould、should ブロックによって提供される文字列 (「should」で始まる) を連結した名前があります。shoulda-context のドキュメントには別の例があります。

于 2012-10-30T09:06:21.307 に答える
0

チェックしましたconfig/initializers/backtrace_silencers.rbか?これが、その動作をカスタマイズするためのエントリ ポイントです。サイレンサースタックをRails.backtrace_cleaner.remove_silencers!クリーンアップできます。

の詳細についてActiveSupport::BacktraceCleanerは、こちらを参照してください。

于 2012-05-04T09:02:45.773 に答える
0

これにより、必要なバックトレースが得られると思います。私はそれをテストしていませんが、動作するはずです:

def exclude_backtrace_from_location(location)
  begin
    yeild
  rescue => e
    puts "Error of type #{e.class} with message: #{e.to_s}.\nBacktrace:"
    back=e.backtrace
    back.delete_if {|b| b~=/\A#{location}.+/}
    puts back
  end
end

exclude_backrace_from_location("test/unit") do
  #some shoulda code that raises...
end
于 2012-04-30T00:07:40.193 に答える