J'aimerais apporter une amélioration à la réponse de @luizbranco pour rendre le rappel after_save plus réutilisable lors de la création d'autres utilisateurs.
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
Exécution sans rappel after_save:
FactoryGirl.create(:user)
Exécution avec le rappel after_save:
FactoryGirl.create(:user, :with_after_save_callback)
Dans mon test, je préfère créer des utilisateurs sans le rappel par défaut car les méthodes utilisées exécutent des éléments supplémentaires que je ne veux normalement pas dans mes exemples de test.
---------- MISE À JOUR ------------ J'ai arrêté d'utiliser skip_callback car il y avait des problèmes d'incohérence dans la suite de tests.
Solution alternative 1 (utilisation de stub et unstub):
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
Solution alternative 2 (mon approche préférée):
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
validation, utilisezafter(:build) { |user| user.class.skip_callback(:validate, :create, :after, :run_something) }