諸事情により FactoryGirl でバリデーションもコールバックも無効にしたいことがあったので。
バリデーションしない
ActiveRecord の #save
に validate: false
を渡すとバリデーションしない。なので、FactoryGirl で create
する時に save!
ではなく save(validate: false)
を呼び出すようにすれば OK。
FactoryGirl でインスタンスを保存する方法を上書きしたい場合は to_create
を定義すれば良い。詳しくはこちら。
FactoryGirl.define do
# ここに書いたら全 factory の to_create が上書きされる。
# to_create { |instance| instance.save(validate: false) }
factory :person do
to_create { |instance| instance.save(validate: false) }
end
end
コールバックを走らせない
ActiveSupport::Callbacks::ClassMethods の skip_callback
を使って、before(:create)
でコールバックをスキップするようにする。それだけだと、factory でインスタンスを作成した後もスキップされっぱなしになるので after(:create)
で set_callback
する。
set/skip_callback
の第一引数には :validate
や :save
など、対象のコールバックが呼び出されるイベントを指定。第二引数ではイベントの :before
、:after
、:around
のいずれで呼び出されるのかを指定。if
や prepend
といったオプションも用意されている。
FactoryGirl.define do
factory :person do
before(:create) { Person.skip_callback(:save, :before, :do_something) }
after(:create) { Person.set_callback(:save, :before, :do_something) }
end
end
参考:http://api.rubyonrails.org/classes/ActiveSupport/Callbacks/ClassMethods.html
まとめると
こうなる。
FactoryGirl.define do
factory :person do
to_create { |instance| instance.save(validate: false) }
before(:create) { Person.skip_callback(:save, :before, :do_something) }
after(:create) { Person.set_callback(:save, :before, :do_something) }
end
end