在使用Factory Girl工厂进行测试时,如何覆盖:AASM中的set_initial_state?

问题描述 投票:0回答:1

更新

回答如下。如果链接的站点消失,您可以使用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">

我总是可以调用t.activate!每个测试中的方法,但这将使我的测试变得脆弱。我正在寻找一种在Factory创建级别运行此方法或在factory.rb中设置它的方法。

谢谢...

ruby-on-rails testing factory factory-bot aasm
1个回答
4
投票

您可以使用模拟框架(mocha)覆盖set_initial_state并在对象上获取正确的状态。

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

here偷来的想法。

© www.soinside.com 2019 - 2024. All rights reserved.