LoginSignup
22
17

More than 5 years have passed since last update.

FactoryGirl でバリデーションもコールバックも無効にしたい

Last updated at Posted at 2015-04-07

諸事情により FactoryGirl でバリデーションもコールバックも無効にしたいことがあったので。

バリデーションしない

ActiveRecord の #savevalidate: 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 のいずれで呼び出されるのかを指定。ifprepend といったオプションも用意されている。

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
22
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
17