Comment substituez-vous: set_initial_state à partir d'AASM lors de tests avec des usines Factory Girl?

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

Question

Mettre à jour

Répondu ci-dessous. Au cas où le site lié disparaîtrait, vous pouvez utiliser mocha pour tronquer l’état initial et empêcher le remplacement, comme dans ...

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

  ...
end

Question originale

J'utilise actuellement le plug-in Acts As State Machine Rails (qui m'a permis de gagner beaucoup de temps) et qui rencontre quelques difficultés à l'utiliser avec Factory Girl (également merveilleux).

Je souhaite pouvoir définir l'état de l'objet lorsque je crée l'objet à l'aide de Factories. Une façon généralisée de poser cette question est & "; Comment appelez-vous les méthodes de classe lors de la création d'un objet avec des factories? &";

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">

Je peux toujours appeler le t.activate! méthode dans chaque test, mais cela rendra mes tests fragiles. Je cherche un moyen d’exécuter cette méthode au niveau de la création Usine ou de la définir dans le fichier factory.rb.

Merci ...

Était-ce utile?

La solution

Vous pouvez utiliser un framework moqueur (mocha) pour remplacer set_initial_state et obtenir le bon état sur votre objet.

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

Idée volée à ici .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top