كيف يمكنك تجاوز: set_initial_state من AASM عند الاختبار مع مصانع المصنع؟
-
20-08-2019 - |
سؤال
تحديث
أجاب أدناه. في حالة اختفاء الموقع المرتبط ، يمكنك استخدام 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 كمساعد State Machine Rails (لقد كان التوفير الزمني الضخم ، بالمناسبة) ولدي بعض التحديات التي تستخدمها مع مصنع فتاة (رائعة أيضًا).
أريد أن أكون قادرًا على تعيين حالة الكائن عندما أقوم بإنشاء الكائن مع المصانع. طريقة معممة لطرح هذا السؤال هي "كيف يمكنك استدعاء أساليب الفصل عند إنشاء كائن مع المصانع؟"
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! الطريقة في كل اختبار ، ولكن هذا سيجعل اختباراتي هشة. أنا أبحث عن طريقة لتشغيل هذه الطريقة على مستوى إنشاء المصنع أو ضبطها في المصنع.
شكرًا...
المحلول
يمكنك استخدام إطار عمل للسخرية (MOCHA) لتجاوز SET_INITIAL_STATE والحصول على الحالة الصحيحة على كائنك.
>> require 'mocha'
=> []
>> Transporter.any_instance.stubs(:set_initial_state)
=> #<Mocha::Expectation:0x21ee6e4 ...
>> t = Factory(:transporter, :state => "active")
=> #<Transporter ... state: "active">
فكرة سرقت من هنا.