代码之家  ›  专栏  ›  技术社区  ›  Alex Baranosky

在Ruby测试中避免受保护的访问器和相等方法

  •  0
  • Alex Baranosky  · 技术社区  · 14 年前

    一些代码如下所示:

    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
    

    如何避免对受保护的属性读取器的需要?实际上,理想情况下,如果我能消除 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文件的顶部,我可以添加这一行来向类中添加一个default==方法:

    Calendar = sub_class_with_equals :Calendar
    

    这使我能够从我的日历类删除五或六行!

    1 回复  |  直到 14 年前
        1
  •  2
  •   DigitalRoss    14 年前

    您可以在测试代码中对类进行monkey修补,这时您也可以去掉protected()调用。

    更好的方法可能是,从测试代码中创建一个Calendar的子类,该子类具有一个访问器和一个==方法。