【问题标题】:Ruby, assert_equal of two arrays of objectsRuby,两个对象数组的assert_equal
【发布时间】:2011-03-11 18:05:22
【问题描述】:

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

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

【问题讨论】:

  • 自从通过 EdgeCase Ruby Koans 学习 ruby​​ 以来,我发现自己一直在使用它们作为参考来解决您的问题。您可能需要检查它们以供将来参考。 rubykoans.com
  • @revdrjrr:感谢提供链接,我已经听说过它们,但一直没有机会找到它们。

标签: ruby unit-testing assert


【解决方案1】:

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

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,更新了答案,因为它太长了,无法在评论中解释:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多