2012-05-05 15 views
0

我在Ruby的測試如下如何獲得一個Ruby單元測試失敗消息來打印對象內容而不是地址?

def testSomeObjectsAreEqual 
    assert_equal(object1, object2) 
end 

如果測試失敗,我得到它指出了兩個對象不相等,並給出消息的以下樣式的預期值和實際值的錯誤消息:

<#<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值,因爲這會使失敗消息對我更有用嗎?

回答

1

測試::單位(我假設你正在使用)使用#pretty_inspect將對象轉換爲可打印的形式。你可以爲你的課程覆蓋/ monkeypatch;你只需要在測試腳本中這樣做。

+0

嗯,這就是我希望會發生,但正如我在問題中提到, to_s在我的類中實現,甚至當我明確地在Ruby中擴展類以指定to_s,因此它調用Java類toString()方法時,它仍然打印對象地址,而不是對象內容(將由to_s給出) ... –

+0

錯誤的測試框架,我的道歉。答覆修正。 –

+0

我用#inspect修飾了我的類,以便它調用Java toString(),並且做到了這一點!我猜測對於JRuby中的Java類,默認的檢查實現不能訪問私有成員,因此我所得到的僅僅是對其的引用。這個問題與我所問的相似,但不完全相同[http://stackoverflow.com/questions/2625667/why-do-this-ruby-object-have-two-to-s-and-inspect-methods - 即-DO最相同的事情。接受你的回答,謝謝。 –

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

我建議,而不是直接在單元測試比較OBJETS,您測試不同的屬性是相同的 - 這將給當部分測試失敗時,您獲得更多信息。直接對象比較的細微之處在於,您可能遇到的問題可能不會爲您的整體測試增加任何價值。

因此,如果該對象,包括名字,姓氏和身份屬性,我建議你重寫的測試是這樣的:

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