【问题标题】:Avoiding protected level accessors and equality methods in Ruby testing在 Ruby 测试中避免受保护的级别访问器和相等方法
【发布时间】:2010-10-24 21:54:51
【问题描述】:

我有一些使用受保护级别 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

在我的规范文件的顶部,我可以添加这一行来为我的类添加一个默认的 == 方法:

Calendar = sub_class_with_equals :Calendar

这使我可以从日历类中删除五六行!

【问题讨论】:

    标签: ruby testing protected


    【解决方案1】:

    您可以从测试代码中对类进行猴子补丁,此时您不妨摆脱#protected() 调用。

    更好的办法是在测试代码中创建一个具有访问器和 == 方法的 Calendar 子类。

    【讨论】:

    • 谢谢@DigitalRoss,我想我会创建一个通用的猴子补丁,为一个类添加一个 == 方法,假设所有字段都是平等的,所以我不必重写它每个文件。
    猜你喜欢
    • 2014-10-31
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    相关资源
    最近更新 更多