У меня проблемы с тестированием StateMachine
s с Factory Girl
.похоже, дело в том, как Factory Girl инициализирует объекты.
Я что-то упустил или это не так просто, как должно быть?
class Car < ActiveRecord::Base
attr_accessor :stolen # This would be an ActiveRecord attribute
state_machine :initial => lambda { |object| object.stolen ? :moving : :parked } do
state :parked, :moving
end
end
Factory.define :car do |f|
end
Итак, начальное состояниезависит от того, установлен ли атрибут stolen
во время инициализации.Кажется, это работает нормально, потому что ActiveRecord устанавливает атрибуты как часть своего инициализатора:
Car.new(:stolen => true)
## Broadly equivalent to
car = Car.new do |c|
c.attributes = {:stolen => true}
end
car.initialize_state # StateMachine calls this at the end of the main initializer
assert_equal car.state, 'moving'
Однако, поскольку Factory Girl инициализирует объект перед индивидуальной настройкой его переопределений (см. factory_girl / proxy / build.rb ), это означает, что поток больше похож на:
Factory(:car, :stolen => true)
## Broadly equivalent to
car = Car.new
car.initialize_state # StateMachine calls this at the end of the main initializer
car.stolen = true
assert_equal car.state, 'moving' # Fails, because the car wasn't 'stolen' when the state was initialized