2014-02-27 77 views
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存根)。

問題:有沒有辦法動態地收集狀態機上的所有轉換條件方法?然後能夠構建一個宏,將所有的條件方法存根出來?

回答

1

嘗試:

transition_conditions = state_machine.events.map(&:branches).flatten.flat_map(&:if_condition) 
+0

我必須壓平分支之前,我可以做最後的平面地圖,因爲分支本身被包裹在陣列。 'Project.state_machine.events.map(&:branches).flatten.flat_map(&:if_condition)'否則很棒!謝謝你的回答,你能證實這個平坦嗎?如果是,我會接受答案。 – ianstarz

+0

running state_machine 1.2.0 btw – ianstarz

+0

也爲其他人引用這裏還有':unless_conditions'裏面的分支如果你也需要那些 – ianstarz

相關問題