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

Я использую state_machine с рельсами для обработки состояния некоторых моделей активных записей и тестирую их с помощью rspec и factory girl. У меня также есть свойство сериализованного массива с именем 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

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

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


person ianstarz    schedule 27.02.2014    source источник


Ответы (1)


Пытаться:

transition_conditions = state_machine.events.map(&:branches).flatten.flat_map(&:if_condition)
person Uri Agassi    schedule 28.02.2014
comment
Мне нужно сгладить ветки, прежде чем я смогу сделать окончательную плоскую карту, потому что сами ветки заключены в массивы. Project.state_machine.events.map(&:branches).flatten.flat_map(&:if_condition) в остальном отлично работает! Спасибо за ответ, вы можете подтвердить сглаживание? Я приму ответ, если это так. - person ianstarz; 02.03.2014
comment
работает state_machine 1.2.0 кстати - person ianstarz; 02.03.2014
comment
также для других, ссылающихся на это, внутри ветвей также есть :unless_conditions, если они вам тоже нужны - person ianstarz; 02.03.2014
comment
@ianstarz Если этот ответ помог вам, проголосуйте за него. Если это решило вашу проблему - примите это - person Uri Agassi; 02.03.2014