Ruby,两个对象数组的assert_equal

时间:2011-03-10 20:37:56

标签: ruby unit-testing assert

我有以下情况。我正在尝试为一组对象编写单元测试。该对象的定义如下:

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

1 个答案:

答案 0 :(得分:3)

尝试使用以下代码为您的类声明方法==

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

Sidenote,您可能也希望重构您的to_s方法,以获得一些简洁的代码。

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

编辑:

数字已经定义了==方法(https://github.com/evanphx/rubinius/blob/master/kernel/bootstrap/fixnum.rb#L117)。

Ruby通过在Array的每个元素上运行==比较来比较数组。这是在数组上==的实现,就像在Rubinius中完成的那样(Ruby实现几乎完全用Ruby编写)https://github.com/evanphx/rubinius/blob/master/kernel/common/array.rb#L474

如果省略各种错误检测,它基本上会对数组的所有元素以递归方式运行==,如果所有元素都匹配则返回true。