测试抽象的 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_communities
和 visible_communities
都进行了很好的测试,但我担心测试 find_communities
。
- 我不想为
my_communities
和 visible_communities
复制测试设置,因为可能
- 我希望 class API 包含所有 3 个 public 方法,因为
find_communities
的条件永远不会改变。
- 我写这篇文章是希望 class 在不久的将来会被我以外的人改变,并且会有更多的方法
我应该:
- 让
find_communities
活在调用者
- 制定
find_communities
自己的策略
- 将测试复制到
find_communities
- 选择你自己的第四个选项。
在这个例子中,您确实应该有两个子类,每个子类都实现自己的 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
我正在尝试找出测试 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_communities
和 visible_communities
都进行了很好的测试,但我担心测试 find_communities
。
- 我不想为
my_communities
和visible_communities
复制测试设置,因为可能 - 我希望 class API 包含所有 3 个 public 方法,因为
find_communities
的条件永远不会改变。 - 我写这篇文章是希望 class 在不久的将来会被我以外的人改变,并且会有更多的方法
我应该:
- 让
find_communities
活在调用者 - 制定
find_communities
自己的策略 - 将测试复制到
find_communities
- 选择你自己的第四个选项。
在这个例子中,您确实应该有两个子类,每个子类都实现自己的 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