J'aimerais apporter une amélioration à la réponse de @luizbranco pour rendre le callback 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 callback after_save :
FactoryGirl.create(:user)
Exécution avec le callback after_save :
FactoryGirl.create(:user, :with_after_save_callback)
Dans mon test, je préfère créer des utilisateurs sans le callback par défaut parce que les méthodes utilisées exécutent des choses supplémentaires que je ne veux pas normalement dans mes exemples de test.
----------UPDATE------------ 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 du stub et du 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