2011-03-10 26 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