¿Cómo anula: set_initial_state de AASM cuando se prueba con las fábricas Factory Girl?
-
20-08-2019 - |
Pregunta
Actualizar
Respondido a continuación. En caso de que el sitio vinculado desaparezca, puede usar mocha para ocultar el estado inicial y evitar sobrescribir como en ...
require 'mocha'
class OrderTest < ActiveSupport::TestCase
def setup
Order.any_instance.stubs(:set_initial_state)
@order = Factory(:order, :state => "other_state")
end
...
end
Pregunta original
Actualmente estoy ejecutando el complemento Acts As State Machine Rails (ha sido un gran ahorro de tiempo, por cierto) y tengo algunos desafíos para usarlo con Factory Girl (también maravilloso).
Quiero poder establecer el estado del objeto cuando creo el objeto con Fábricas. Una forma generalizada de hacer esta pregunta es & Quot; ¿cómo se llaman los métodos de clase al crear un objeto con Fábricas? & Quot;
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">
¡Siempre puedo llamar a t.activate! método dentro de cada prueba, pero esto hará que mis pruebas sean frágiles. Estoy buscando una manera de ejecutar este método en el nivel de creación de Factory o configurarlo en factory.rb.
Gracias ...
Solución
Puede usar un marco de imitación (mocha) para anular set_initial_state y obtener el estado correcto en su objeto.
>> require 'mocha'
=> []
>> Transporter.any_instance.stubs(:set_initial_state)
=> #<Mocha::Expectation:0x21ee6e4 ...
>> t = Factory(:transporter, :state => "active")
=> #<Transporter ... state: "active">
Idea robada de aquí .