मैं अन्य उपयोगकर्ताओं को बनाने के दौरान after_save कॉलबैक को अधिक पुन: प्रयोज्य बनाने के लिए @luizbranco के उत्तर में सुधार करना चाहता हूं।
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 कॉलबैक के साथ चल रहा है:
FactoryGirl.create(:user, :with_after_save_callback)
अपने परीक्षण में, मैं डिफ़ॉल्ट रूप से कॉलबैक के बिना उपयोगकर्ताओं को बनाना पसंद करता हूं, क्योंकि जिन तरीकों से अतिरिक्त सामान का उपयोग किया जाता है, वे सामान्य रूप से मेरे परीक्षण के उदाहरणों में नहीं चाहिए।
---------- अद्यतन ------------ मैंने 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) }