레일을 사용하여 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)하는 매크로를 빌드 할 수 있습니까?
나는 자체는 배열에 싸여있는 나뭇 가지 때문에 최종 평면지도를 할 수 전에 가지를 평평하게해야합니다. 'Project.state_machine.events.map (& : branches) .flatten.flat_map (& : if_condition)'그렇지 않으면 잘 작동합니다! 대답 주셔서 감사합니다, 평평한를 확인할 수 있습니까? 그렇다면 대답을 수락합니다. – ianstarz
running state_machine 1.2.0 btw – ianstarz
또한 이것을 참조하는 다른 사람들을 위해서도 필요하다면 브랜치 안에'unless_conditions'도 있습니다 – ianstarz