Ruby, assert_equal двух массивов объектов - PullRequest
3 голосов
/ 10 марта 2011

У меня следующая ситуация.Я пытаюсь написать модульный тест для массива объектов.Объект определяется примерно так:

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

Во время теста я утверждаю два массива, каждый из которых содержит три элемента, элементы идентичны, и даже порядок идентичен, но я получаю ошибку, что assert isn 'т равен.Я полагаю, что я упускаю что-то действительно простое здесь, в чем прикол?

Если я сравниваю каждый элемент методом to_s, утверждение верно. Так ли это должно быть сделано в первую очередь?

1 Ответ

3 голосов
/ 10 марта 2011

Попробуйте объявить метод == для вашего класса со следующим кодом.

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

Sidenote, вы можете также реорганизовать свой метод to_s для некоторого краткого кода.

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

Edit:

Для чисел уже определен метод == (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, если все они совпадают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...