@Luizbranco'nun yanıtında, diğer kullanıcılar oluştururken after_save geri aramayı daha yeniden kullanılabilir hale getirmek için bir iyileştirme yapmak istiyorum.
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
Kaydetme sonrası geri araması olmadan çalıştırma:
FactoryGirl.create(:user)
Kaydetme sonrası geri arama ile çalıştırılıyor:
FactoryGirl.create(:user, :with_after_save_callback)
Testimde, varsayılan olarak geri arama olmadan kullanıcılar oluşturmayı tercih ediyorum çünkü kullanılan yöntemler normalde test örneklerimde istemediğim fazladan şeyler çalıştırıyor.
---------- GÜNCELLEME ------------ Test paketinde bazı tutarsızlık sorunları olduğu için skip_callback'i kullanmayı bıraktım.
Alternatif Çözüm 1 (saplama ve saplama kaldırma kullanımı):
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
Alternatif Çözüm 2 (tercih ettiğim yaklaşım):
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
doğrulamayı atlamak istiyorsanız , şunu kullanınafter(:build) { |user| user.class.skip_callback(:validate, :create, :after, :run_something) }