Как заглушить все методы условия в 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)