保護されたレベルの attr_readers を使用して == メソッドを実装できる Ruby コードがいくつかあります。これにより、結果の Calendar が期待される Calendar と等しいことをアサートできます)。ただし、これらの保護されたアクセサーは、テストのアサーション以外のコードには必要ありません。コード。
私が持っているいくつかのコードは次のようになります:
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==(......
実際、理想的には、 もテストにのみ必要なので、の必要性を取り除くことができれば素晴らしいことです!
万歳、アレックス
これで最初の刺し傷:
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
これにより、Calendar クラスから 5 ~ 6 行を削除できます。