【问题标题】:How do you override :set_initial_state from AASM when testing with Factory Girl factories?在使用 Factory Girl 工厂进行测试时,如何覆盖 AASM 中的 :set_initial_state?
【发布时间】:2009-06-28 11:58:02
【问题描述】:

更新

在下面回答。如果链接的站点消失了,您可以使用 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 一起使用它时遇到了一些挑战(也很棒)。

我希望能够在使用工厂创建对象时设置对象状态。问这个问题的一种通用方式是“在使用工厂创建对象时如何调用类方法?”

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.rb 中的方法。

谢谢...

【问题讨论】:

    标签: ruby-on-rails testing factory factory-bot aasm


    【解决方案1】:

    您可以使用模拟框架 (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 窃取的想法。

    【讨论】:

    • 非常感谢。谷歌搜索这个答案 30 分钟,我找不到它。嗬!不管怎样,谢谢。也许下一个人会更容易通过 StackOverflow SEO 找到它。
    猜你喜欢
    • 1970-01-01
    • 2014-10-10
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多