Éviter accesseurs niveau protégé et les méthodes d'égalité dans les tests Ruby
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!
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.