2015-02-24 44 views
5

每當我試着assert_equal兩個對象,我總能得到象這樣的錯誤:MINITEST斷言失敗的檢查

No visible difference in the User#inspect output. 
    You should look at the implementation of #== on User or its members. 

這是發生與時間和陣爲好。 Minitest的文檔在這方面也沒有多說太多。

我使用Ruby 2.0.0,但我使用的是2.2.0,發生的情況也是如此。也使用最新的minitest。

此外,我運行Ubuntu 14.10。

+0

這是否真的發生*所有*對象,你有沒有試過比較像整數一樣的基本東西?你能舉一些例子嗎? – Jesper 2015-02-24 14:28:10

+0

您使用的是自定義difftool嗎? – Jesper 2015-02-24 14:28:56

+0

它實際上只是發生在我創建的時間,數組和自定義對象上,比如User類。我沒有使用任何自定義工具。 示例: 'result = @ service.run' 'result.must_equal(@ users.get_single(1))' 注意:我也嘗試了assert_equal,並且發生了同樣的情況 – 2015-02-24 14:34:42

回答

7

關於該消息

該消息,這有點不是錯誤,示出當斷言失敗,但MINITEST未能找到對象之間的差異。

Check out this method

diff對這兩個對象運行#inspect並運行diff工具。如果沒有差異,則顯示此消息。

原則上,您希望兩個不相等的對象在檢查時具有不同的輸出。這不是寫在石頭上,紅寶石標準庫中的一些類不會填充此屬性,如Time。當涉及到你自己的班級時,也許你已經寫了一個自定義的#inspect方法?

關於Time,檢查只顯示秒,而不是分數,但相等看分數,所以兩個時間對象可能不相等,但在檢查時仍然看起來相同。

關於Array,如果其中包含的對象可能不相同,但在檢查時看起來相同,則會導致顯示消息。

如果即使檢查輸出不同,您也會收到此消息,但diff工具有問題。 MiniTest試圖對使用哪種diff工具進行一些有教育的猜測。您可以通過打印MiniTest::Assertions.diff來檢查所選的差異工具。

在對象平等

如果真正的問題是,當你期望他們,你應該看看==方法是如何在各自的類中定義你的對象是不相等的。默認實現查看實例化時爲每個對象提供的對象id,如果例如處理表示數據庫行的對象,則可能不是您想要的。

+0

我沒有創建自定義#inspect方法在任何對象上,而奇怪的是我只是在不同的環境(OS X Yosemite)上測試了一切,並且一切正常 – 2015-02-24 15:13:06

+0

原始系統是什麼? – Jesper 2015-02-24 15:14:52

+0

Ubuntu 14.10(這是在我的問題的底部),我用Ruby 2.2和2.0 – 2015-02-24 15:55:54

1

也許2個對象的編碼實例是不同的。使用encodingforce_encoding檢查:

puts obj1.encoding 
puts obj2.encoding 

下面是一個例子了放:

ISO-8859-1 
ASCII-8BIT 

在這種情況下OBJ1的編碼方式實例ISO-8859-1和OBJ 2的編碼實例ASCII-8BIT。 然後OBJ1的編碼實例轉換ASCII-8BITforce_encoding

assert_equal(obj1.force_encoding(Encoding::ASCII_8BIT), obj2) 

欲瞭解更多詳情請https://ruby-doc.org/core-2.2.0/Encoding.html

0

我有以下錯誤:

No visible difference in the String#inspect output. 

,並試圖@協議的答案 - 我這個:

NoMethodError: undefined method `encoding' for "5930128297ebef21e1c7fd50":BSON::ObjectId 

我使用的是Mongoid,所以至少在這個問題上,解決方法是在BSON對象上調用to_s,我的字符串相等是我期望的。