다른 사용자를 만들 때 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)
내 테스트에서는 사용 된 메서드가 테스트 예제에서 일반적으로 원하지 않는 추가 항목을 실행하기 때문에 기본적으로 콜백없이 사용자를 생성하는 것을 선호합니다.
---------- 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) }