Избегание защищенных методов доступа и методов равенства в тестировании Ruby - PullRequest
0 голосов
/ 25 октября 2010

У меня есть некоторый Ruby-код, который использует защищенный уровень attr_readers, чтобы иметь возможность реализовать метод ==, чтобы мы могли утверждать, что некоторый результирующий календарь равен ожидаемому календарю), но эти защищенные средства доступа не понадобятся ни для какого кода, кроме утверждения в тестовом коде.

Какой-то код у меня выглядит следующим образом:

class Calendar    
  def initialize(date_times)
    @date_times = date_times
  end

  def next_date_time
    @date_times.find { |time| time - DateTime.now > 0 }
  end

  def ==(other)
    @date_times == other.date_times
  end

  protected

  attr_reader :date_times
end

Как мне избежать необходимости защищенных attr_readers? На самом деле, в идеале было бы неплохо, если бы я мог убрать необходимость и в def==(......, поскольку он также необходим только для тестов!

Всего наилучшего, Alex

Первый удар в этом:

module Kernel
  def subclass_with_equals(class_symbol)
    clazz = Kernel.const_get(class_symbol.to_s)
    Kernel.subclass_with_default_equals(clazz)
  end

  private

  def self.subclass_with_default_equals(base_class)
    sub_class = Class.new(base_class)
    sub_class.class_eval do
      def ==(other)
        instance_variables.all? { |v| self.instance_variable_get(v) == other.instance_variable_get(v) } and other.instance_of? self.class
      end
    end
    sub_class
  end
end

И в верхней части моего spec-файла я могу добавить эту строку, чтобы добавить метод по умолчанию == в мой класс:

Calendar = sub_class_with_equals :Calendar

Это позволяет мне удалить пять или шесть строк из моего класса Календаря!

1 Ответ

2 голосов
/ 25 октября 2010

Вы могли бы пропатчить класс изнутри тестового кода, и в этот момент вы также можете избавиться от вызова #protected ().

Еще лучше было бы сделать это из тестакод, создайте подкласс Calendar, который имеет метод доступа и метод ==.

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