공장 소녀 공장에서 테스트 할 때 AAMS의 set_initial_state를 어떻게 재정의합니까?

StackOverflow https://stackoverflow.com/questions/1054786

문제

업데이트

아래에 답했습니다. 링크 된 사이트가 사라지는 경우 Mocha를 사용하여 초기 상태를 스텁하고과 같이 덮어 쓰기를 방지 할 수 있습니다.

require 'mocha'
class OrderTest < ActiveSupport::TestCase
  def setup
    Order.any_instance.stubs(:set_initial_state)
    @order = Factory(:order, :state => "other_state")
  end

  ...
end

원래 질문

나는 현재 State Machine Rails 플러그인으로서 (우연히도 큰 시간을 절약 한) Acts를 실행하고 있으며 공장 소녀 (또한 훌륭함)와 함께 사용하는 데 어려움을 겪고 있습니다.

공장으로 객체를 만들 때 객체 상태를 설정할 수 있기를 원합니다. 이 질문을하는 일반화 된 방법은 "공장으로 객체를 만들 때 클래스 방법을 어떻게 호출합니까?"입니다.

class Transporter < ActiveRecord::Base
  validates_presence_of :company_name, :on => :update
  acts_as_state_machine :initial => :created, :column => 'status'
  state :created
  state :active
  state :inactive, :after => :inactivate_transporter_activity
end

Factory.define :transporter do |f|
  f.sequence(:company_name) {|n| "transporter_company#{n}"}
end

>> t=Factory(:transporter)
=> <Transporter ... status: "created">
>> t=Factory(:transporter, :status => 'active')
=> <Transporter ... status: "created"> #as expected, changes state back
>> t.activate!
=> true
>> t
=> <Transporter ... status: "active">

나는 항상 t.activate를 호출 할 수 있습니다! 모든 테스트 내에서 방법이지만 테스트가 부서지기 쉬워집니다. 공장 생성 레벨 에서이 방법을 실행하거나 공장에서 설정하는 방법을 찾고 있습니다.

감사...

도움이 되었습니까?

해결책

Mocking Framework (Mocha)를 사용하여 Set_initial_state를 무시하고 객체에서 올바른 상태를 얻을 수 있습니다.

>> require 'mocha'
=> []
>> Transporter.any_instance.stubs(:set_initial_state)
=> #<Mocha::Expectation:0x21ee6e4 ...
>> t = Factory(:transporter, :state => "active")
=> #<Transporter ... state: "active">

아이디어가 도난당했습니다 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top