0
我正在使用state_machine
和rails來處理某些活動記錄模型的狀態,並使用rspec和factory女孩測試它們。我還有一個名爲state_path
的序列化數組屬性,用於跟蹤狀態歷史記錄。現在如何在ruby的state_machine中存根測試所有條件方法?
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
然而,過渡性狀況的方法名稱可以改變,或者可以添加更多的條件,這我不能在這個測試(顯然真正關心的,因爲我m存根)。
問題:有沒有辦法動態地收集狀態機上的所有轉換條件方法?然後能夠構建一個宏,將所有的條件方法存根出來?
我必須壓平分支之前,我可以做最後的平面地圖,因爲分支本身被包裹在陣列。 'Project.state_machine.events.map(&:branches).flatten.flat_map(&:if_condition)'否則很棒!謝謝你的回答,你能證實這個平坦嗎?如果是,我會接受答案。 – ianstarz
running state_machine 1.2.0 btw – ianstarz
也爲其他人引用這裏還有':unless_conditions'裏面的分支如果你也需要那些 – ianstarz