Как вы переопределяете :set_initial_state из AASM при тестировании с Factory Girl factories?

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

Вопрос

Обновить

Ответ приведен ниже.В случае, если связанный сайт исчезнет, вы можете использовать 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 (что, кстати, значительно экономит время) и сталкиваюсь с некоторыми проблемами при его использовании с Factory Girl (тоже замечательно).

Я хочу иметь возможность устанавливать состояние объекта при создании объекта с помощью 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">

Я всегда могу позвонить т.активировать!метод внутри каждого теста, но это сделает мои тесты хрупкими.Я ищу способ запустить этот метод на уровне создания фабрики или установить его в factory.rb.

Спасибо...

Это было полезно?

Решение

Вы можете использовать mocking framework (mocha), чтобы переопределить set_initial_state и получить правильное состояние вашего объекта.

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

Идея, украденная у здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top