0

アップデート

以下、回答。リンク先のサイトが消えてしまった場合、mochaを使って初期状態をスタブし、上書きを防ぐことができます...

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

  ...
end

元の質問

私は現在、Acts As State Machine Rails Plugin を実行しており (ちなみに、大幅に時間を節約できました)、Factory Girl でそれを使用する際にいくつかの課題があります (これも素晴らしいことです)。

Factory でオブジェクトを作成するときに、オブジェクトの状態を設定できるようにしたいと考えています。この質問の一般化された言い方は、「ファクトリでオブジェクトを作成するとき、どのようにクラス メソッドを呼び出しますか?」です。

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! を呼び出すことができます。メソッドをすべてのテスト内で使用しますが、これによりテストが脆弱になります。このメソッドを Factory 作成レベルで実行するか、factory.rb 内で設定する方法を探しています。

ありがとう...

4

1 に答える 1

4

モッキング フレームワーク (mocha) を使用して set_initial_state をオーバーライドし、オブジェクトの正しい状態を取得できます。

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

アイデアはここから盗まれました。

于 2009-06-28T20:05:26.457 に答える