Я использую 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
Однако имя метода условия перехода может быть изменено или могут быть добавлены дополнительные условия, что меня не очень волнует в этом тесте (очевидно, поскольку я заглушаю его).
Вопрос. Есть ли способ динамически собирать все методы условий перехода на машине состояний? Чтобы затем иметь возможность создать макрос, который заглушает все методы условий?