Comment substituez-vous: set_initial_state à partir d'AASM lors de tests avec des usines Factory Girl?
-
20-08-2019 - |
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 ...
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 .