ฉันต้องการปรับปรุงคำตอบของ @luizbranco เพื่อให้การโทรกลับ after_save ใช้ซ้ำได้มากขึ้นเมื่อสร้างผู้ใช้รายอื่น
FactoryGirl.define do
factory :user do
first_name "Luiz"
last_name "Branco"
#...
after(:build) { |user|
user.class.skip_callback(:create,
:after,
:run_something1,
:run_something2)
}
trait :with_after_save_callback do
after(:build) { |user|
user.class.set_callback(:create,
:after,
:run_something1,
:run_something2)
}
end
end
end
ทำงานโดยไม่มีการโทรกลับ after_save:
FactoryGirl.create(:user)
ทำงานด้วย after_save callback:
FactoryGirl.create(:user, :with_after_save_callback)
ในการทดสอบของฉันฉันต้องการสร้างผู้ใช้โดยไม่มีการเรียกกลับตามค่าเริ่มต้นเนื่องจากวิธีการที่ใช้เรียกใช้สิ่งพิเศษที่ฉันไม่ต้องการในตัวอย่างการทดสอบของฉัน
---------- UPDATE ------------ ฉันหยุดใช้ skip_callback เนื่องจากมีปัญหาบางอย่างที่ไม่สอดคล้องกันในชุดทดสอบ
โซลูชันทางเลือก 1 (ใช้ต้นขั้วและยกเลิกการติดตั้ง):
after(:build) { |user|
user.class.any_instance.stub(:run_something1)
user.class.any_instance.stub(:run_something2)
}
trait :with_after_save_callback do
after(:build) { |user|
user.class.any_instance.unstub(:run_something1)
user.class.any_instance.unstub(:run_something2)
}
end
โซลูชันทางเลือก 2 (แนวทางที่ฉันต้องการ):
after(:build) { |user|
class << user
def run_something1; true; end
def run_something2; true; end
end
}
trait :with_after_save_callback do
after(:build) { |user|
class << user
def run_something1; super; end
def run_something2; super; end
end
}
end
:on => :create
ตรวจสอบความถูกต้องให้ใช้after(:build) { |user| user.class.skip_callback(:validate, :create, :after, :run_something) }