2014-02-27 11 views
0

레일을 사용하여 state_machine을 사용하여 일부 활성 레코드 모델에서 상태를 처리하고 rspec 및 팩토리 소녀로 테스트합니다. 또한 상태 기록을 추적하는 state_path이라는 직렬화 된 배열 속성이 있습니다.테스트를 위해 루비의 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 

그러나, 이행 조건 메소드 이름은 변경할 수 이상의 조건 ​​내가 '이후 내가 분명히이 테스트 (에 정말 관심이 아니에요, 이는 추가 할 수 그것 stubbing m).

질문 : 상태 시스템에서 모든 전환 조건 메서드를 동적으로 수집하는 방법이 있습니까? 그런 다음 모든 조건 메소드를 스텁 (stub)하는 매크로를 빌드 할 수 있습니까?

답변

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