如果有条件则测试摘要

时间:2019-06-18 18:13:21

标签: ruby testing rspec

我正在尝试找出一种在这里测试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. 我希望类API包含所有3个公共方法,因为find_communities的条件永远不会改变。
  3. 我写这篇文章的目的是希望在不久的将来班级将由我以外的其他人更改,并且将会有更多的方法

我应该:

  1. 使find_communities驻留在呼叫者中
  2. find_communities设为自己的策略
  3. 将测试复制到find_communities
  4. 选择您自己的第四个选项。

1 个答案:

答案 0 :(得分:2)

在此示例中,您确实应该有两个子类,每个子类实现自己的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