0

私は次のようにRubyでテストを行っています

def testSomeObjectsAreEqual
  assert_equal( object1, object2 )
end

このテストが失敗すると、2つのオブジェクトが等しくないことを示すエラーメッセージが表示され、期待値と実際の値に対して次のスタイルのメッセージが表示されます。

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

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

4

4 に答える 4

1

Test :: Unit(私はあなたが使用しているものだと思います)は#pretty_inspectオブジェクトを印刷可能な形式に変換するために使用します。クラスに対してこれをオーバーライド/モンキーパッチすることができます。テストスクリプトでこれを行う必要があるだけです。

于 2012-05-05T08:12:38.910 に答える
1

Уouは、失敗メッセージに注釈を追加できます。

assert_equal( object1, object2, "my message: #{object1.to_s},  #{object2.to_s}" )
于 2012-05-05T13:02:12.270 に答える
0

これがきちんと手に入れたのかわかりません。ただし、引数を(独自のクラスの)オブジェクトとして受け入れるクラス内のメソッドを作成できます。比較が失敗した場合はraise、例外(たとえば)を実行し、それに応じて次の方法でそれをアサートできます。

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

間違っているかもしれません、ここで私を訂正してください。

于 2012-05-05T08:22:01.147 に答える
0

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

したがって、オブジェクトにfirst_name、last_name、statusを含む属性がある場合は、次のようにテストを書き直すことをお勧めします。

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
于 2012-05-05T13:12:23.980 に答える