Тестирование абстрактно, если условно - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь найти лучший способ проверить 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.

  1. Я не хочу дублировать настройки теста для my_communities и visible_communities, потому что, скорее всего, будет
  2. Я бы предпочел, чтобы API класса содержал все 3 открытых метода, потому что условия для find_communities никогда не изменятся.
  3. Я пишу это с надеждой, что в ближайшем будущем класс изменится кем-то, кроме меня, и что будет больше методов

Должен ли я:

  1. сделать find_communities жить в вызывающей
  2. сделать find_communities своей собственной стратегией
  3. дублировать тесты в find_communities
  4. выберите свой 4-й вариант.

1 Ответ

2 голосов
/ 18 июня 2019

В этом примере вы действительно должны иметь два подкласса, каждый из которых реализует свой собственный метод 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...