2011-03-10 55 views
3

我有以下情況。我正在嘗試爲一組對象編寫單元測試。的對象被定義是這樣的:Ruby,兩個對象數組的assert_equal

class Element 
    attr_reader :title, :season, :episode 

    def initialize (name, number) 
    @name = name 
    @number = number 
    end 

    def to_s 
    number = "%02d" % @number 

    result = "Number " << number << " " << @name 
    result 
    end 
end 

在試驗過程中我斷言兩個數組其中兩個包含三個元素,該元素是相同的,甚至順序是相同還是我得到一個錯誤,該斷言不等於。我想我在這裏錯過了一些非常基本的東西,這是什麼?

如果我通過to_s方法比較每個元素,assert是正確的。這是否應該在第一個地方完成?

+2

自從通過EdgeCase Ruby Koans學習Ruby之後,我發現自己一直在使用它們作爲你的問題的參考。您可能需要檢查它們以備將來參考。 http://rubykoans.com/ – revdrjrr 2011-03-10 20:52:03

+0

@revdrjrr:感謝您的鏈接,我已經聽說過他們,但從來沒有機會找到它們。 – Mark 2011-03-11 07:56:01

回答

3

嘗試使用以下代碼爲您的課程聲明方法==

def ==(other) 
    self.to_s == other.to_s 
end 

旁註,你可能想重構你的to_s方法,以獲得一些簡潔的代碼。

def to_s 
    "Number %02d #{@name}" % @number 
end 

編輯:

號碼已經定義的==方法(https://github.com/evanphx/rubinius/blob/master/kernel/bootstrap/fixnum.rb#L117)。

Ruby通過在陣列的每個元素上運行==比較來比較陣列。這是數組上的==的實現,如Rubinius(幾乎完全寫在Ruby本身中的Ruby實現)https://github.com/evanphx/rubinius/blob/master/kernel/common/array.rb#L474中所做的那樣。

如果忽略各種錯誤檢測,它基本上會對數組的所有元素遞歸地運行==,如果它們全部匹配,則返回true。

+0

好的,謝謝,但爲什麼我必須在第一時間做到這一點?當我有一組數字說話的數字(它們本身就是對象,據我瞭解..)我不必覆蓋==方法。 並感謝重構提示:) – Mark 2011-03-11 05:31:40

+0

@Mark,更新了答案,因爲它太長,以解釋評論:) – Dogbert 2011-03-11 10:05:37