Как заглушить все методы условия в state_machine ruby ​​для тестирования?

Я использую state_machine с рельсами для обработки состояния на некоторых активных моделях записи и тестирования их с помощью rspec и фабричной девушки. У меня также есть свойство сериализованного массива под названием state_path это отслеживает государственную историю.

class Project < ActiveRecord::Base
  serialize :state_path, Array

  def initialize(*)
    super
    state_path << state_name
  end

  state_machine :state, :initial => :draft do
    after_transition do |project, transition|
      project.state_path << transition.to_name
    end

    event :do_work do
      transition :draft => :complete, :if => :tps_has_cover_page?
    end

    state :draft do
      # ...
    end

    state :complete do
      # ...
    end
  end

  private
    def tps_has_cover_page?
      # ...
    end
end

Теперь, чтобы проверить, что after_transition крюк правильно заполняет state_path собственность, я заглушаю tps_has_cover_page? метод переходного условия, потому что мне не нужны эти функции в этом тесте, а также он интегрирован с другими моделями (возможно, модель отчета tps?)

it "should store the state path" do
  allow_any_instance_of(Project).to receive(:tps_has_cover_page?).and_return(true)

  project = create(:project)
  project.do_work

  expect(project.state_path).to eq([:draft, :complete])
end

Тем не менее, имя метода условия перехода может измениться, или могут быть добавлены дополнительные условия, которые меня не особо интересуют в этом тесте (очевидно, поскольку я его заглушаю).

Вопрос: есть ли способ динамически собрать все методы условия перехода на автомате? Чтобы потом иметь возможность построить макрос, который заглушает все методы условия?

1 ответ

Решение

Пытаться:

transition_conditions = state_machine.events.map(&:branches).flatten.flat_map(&:if_condition)
Другие вопросы по тегам