0

保護されたレベルの 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 行を削除できます。

4

1 に答える 1

2

テスト コード内からクラスにモンキー パッチを適用することができ、その時点で #protected() 呼び出しを取り除くこともできます。

テスト コード内から、アクセサと == メソッドを持つ Calendar のサブクラスを作成するのがさらに良いかもしれません。

于 2010-10-24T22:07:24.790 に答える