测试抽象的 if 条件

Testing an abstracted if conditional

我正在尝试找出测试 find_communities 的最佳方法,而不是在这里使用多态性来击败盯着我看的 if 语句。

class CommunityFinder
  def initialize(filters={})
    @filters = filters
  end

  def find_communities
     return my_communities if @filters[:my_communities]
     visible_communities
  end

  def my_communities
     # [...]
  end

  def visibile_communities
     # [...]
  end
end

我对 my_communitiesvisible_communities 都进行了很好的测试,但我担心测试 find_communities

  1. 我不想为 my_communitiesvisible_communities 复制测试设置,因为可能
  2. 我希望 class API 包含所有 3 个 public 方法,因为 find_communities 的条件永远不会改变。
  3. 我写这篇文章是希望 class 在不久的将来会被我以外的人改变,并且会有更多的方法

我应该:

  1. find_communities活在调用者
  2. 制定find_communities自己的策略
  3. 将测试复制到 find_communities
  4. 选择你自己的第四个选项。

在这个例子中,您确实应该有两个子类,每个子类都实现自己的 communities 方法:

class CommunityFinder::Base
  def initialize(**options)
    @options = options
  end
end

class CommunityFinder::Mine < CommunityFinder::Base
  def communities
  end
end

class CommunityFinder::Visible < CommunityFinder::Base
  def communities
  end
end

您可以使用工厂方法实例化正确的子类:

module CommunityFinder
  def self.filter(**options)
    if (options[:my_communities])
      CommunityFinder::Mine.new(options)
    else
      CommunityFinder::Visible.new(options)
    end
  end
end