2012-05-05 4 views
0

アドレスではなくオブジェクトの内容を印刷するRubyユニットテストの失敗メッセージを取得するにはどうすればよいですか?

def testSomeObjectsAreEqual 
    assert_equal(object1, object2) 
end 

を次のように、このテストは、私は2つのオブジェクトが等しいものではなく、期待値と実際の値のために、メッセージの次のスタイルを与えることを示すエラーメッセージが取得失敗したとき、私はRubyでのテストを持っている:

<#<Java:com.mynamespace.MyClass:0x1232b3e12>> expected but was 
<#<Java:com.mynamespace.MyClass:0x489654ebd>>. 

ご覧のとおり、私はJRubyを使ってJavaクラスをインスタンス化しています。これが比較対象です。私はRubyでobject.to_sを印刷しようとしていて、賢明な見た目のメッセージを出力しますが、toString()メソッドが直接MyClassのtoString()メソッドにマップされているようですが、to_sはアサーションの失敗メッセージには使用されません。とにかくRubyテスト/ユニットにオブジェクトのto_s値を使用させることができるのですが、これは失敗メッセージを私にとってはるかに便利にするでしょうか?

答えて

1

Test :: Unit(これはあなたが使用しているものと仮定します)は、#pretty_inspectを使用して、オブジェクトを印刷可能なフォームに変換します。あなたはこのクラスをオーバーライドする/ monkeypatchすることができます。テストスクリプトでのみ行う必要があります。

+0

まあ、それは私が起こることを望んだものだが、私は私の質問で述べたようにto_sは私のクラスで実装されていますが、to_sを指定するRubyのクラスを明示的に拡張してJavaクラスtoString()メソッドを呼び出すときでも、オブジェクトの内容ではなくオブジェクトのアドレス(to_sによって与えられる) ... –

+0

誤ったテストフレームワーク、私の謝罪。回答が修正されました。 –

+0

#inspectで私のクラスをmonkeypatchedして、JavaのtoString()を呼び出すようにしました。 JRubyのJavaクラスでは、デフォルトのインスペクション実装でプライベートメンバーにアクセスすることはできないと考えられます。この質問は私が求めているものと似ていますが、正確には同じではありません[http://stackoverflow.com/questions/2625667/why-do-this-ruby-object-have-two-to-s-and-inspect-methods - 同じことをする - ]。あなたの答えを受け入れる、ありがとう。 –

0

私はこれが適切かどうかわかりません。しかし、引数をオブジェクトとして受け取る(自分のクラスの)メソッドをクラス内で作成することができます。比較が失敗した場合は、例外をraise(例えば)、その後、それに対応してそれを主張することができます

assert_raises(TypeError){object1.compare(object2)} 

間違っている可能性があり、ここで私を修正してください。

+0

私はあなたが何を意味するのか見ていますが、クラスには既にequals()メソッドがあります。これは比較のために使用されていると推定しています。私が実際にやっているのは、障害メッセージのオブジェクトを文字列に自動的に変換することです。たとえば、JUnit for JavaはあなたのクラスのtoString()を実装しています。 –

1

Уouは、障害メッセージにいくつかの注釈を追加することができます。私はむしろ、ユニットテストで直接オブジェを比較するよりも、それをお勧めします

assert_equal(object1, object2, "my message: #{object1.to_s}, #{object2.to_s}") 
+0

あなたの答えをありがとう、私はこれを考慮していたが、フレームワークが私にかなり失敗メッセージを与えることを望んでいた。私が何か別のことをやっているのかどうか疑問に思います... –

0

、あなたは異なる属性が同じであることをテストする - これが得られますテストの一部が失敗したときに、より多くの情報を得ることができます。直接オブジェクト比較の微妙なことがあります。これは、全体的なテストに価値を追加する可能性があります。

オブジェクトがFIRST_NAME、LAST_NAMEとステータスを含めた属性を持っていたのであれば、私はテストをこのように書き換えるお勧めします:

def testSomeObjectsAreEqual 
    assert_equal(object1.first_name, object2.first_name) 
    assert_equal(object1.last_name, object2.last_name) 
    assert_equal(object1.status, object2.status) 
    ... etc ... 
end 
関連する問題