我想对@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回调运行:
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) }