Ruby,比较两个对象数组的assert_equal

3

我有一个问题,我正在尝试为一个对象数组编写单元测试。该对象的定义类似于以下内容:

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方法比较每个元素,那么断言就是正确的..这是首先应该完成的吗?


2
自从通过EdgeCase Ruby Koans学习Ruby以来,我发现自己一直把它们作为一个参考,用来回答像你这样的问题。你可以考虑在将来的参考中查看它们。http://rubykoans.com/ - revdrjrr
@revdrjrr:感谢提供链接,我已经听说过它们,但从未有机会找到它们。 - Mark
1个回答

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。


好的,它起作用了,谢谢。但是为什么我首先要这样做呢?当我有一个数字数组(据我所知,它们本身也是对象..)时,我不必重写==方法。 感谢您提供的重构提示 :) - Mark
@Mark,答案已更新,因为在评论中解释太长了 :) - Dogbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接