Éviter accesseurs niveau protégé et les méthodes d'égalité dans les tests Ruby

StackOverflow https://stackoverflow.com/questions/4010661

  •  25-09-2019
  •  | 
  •  

Question

J'ai un code Ruby qui utilise attr_readers niveau protégé pour être en mesure de mettre en œuvre une méthode == afin que nous puissions affirmer un certain calendrier qui en résulte est égal à un calendrier prévu), mais ces accesseurs protégées ne serait pas nécessaire pour un code en plus assertions dans le code de test.

Une partie du code je ressemble à ceci:

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

Comment puis-je éviter la nécessité d'attr_readers protégées? En fait, dans l'idéal ce serait bien si je pouvais supprimer la nécessité de def==(...... aussi bien, car il est aussi nécessaire que pour les tests!

Tous les meilleurs, Alex

Un premier coup de couteau à ceci:

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

Et en haut de mon fichier de spécification que je peux ajouter cette ligne à ajouter une méthode par défaut == à ma classe:

Calendar = sub_class_with_equals :Calendar

Cela me permet de supprimer cinq ou six lignes de ma classe de calendrier!

Était-ce utile?

La solution

Vous pourriez singe patcher la classe à partir du code de test, et à ce moment-là, vous pouvez aussi bien se débarrasser de l'appel #protected ().

Mieux encore peut-être à, à partir du code de test, créez une sous-classe de calendrier qui a un accesseur et == méthode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top