2
0

More than 1 year has passed since last update.

FactoryBot で save 時に context を渡す

Posted at

前置き: validation_context とは

避けたい validation がある時など、validation の条件に validation_context を利用し、

app/model/user.rb
class User < ApplicationRecord
  before_validation :set_bar, unless: -> { validation_context == :hoge }
  # ...
end

save 時に、context を指定してあげれば、validation を避けられます。

app/controller/user/user_controller.rb
class User::UsersController < User::ApplicationController
    def create
        @user = User.new(user_params)
        @user.save(context: :hoge)
        # ...
    end
    # ...
end

ただ、この動作を FactoryBot だとどうすれば良いのか分からなかったので、書いときます。

本題: FactoryBot での context 指定

結論としては to_create を使えばできます!

例えば、to_createcontext を指定して save する trait を作成して、

spec/factories/users.rb
FactoryBot.define do
  factory :user do
    trait :context_hoge do
      to_create { |instance| instance.save(context: :hoge) }
    end
    # ...
  end
end

create 時に指定すると、作成した trait を指定すると、上手くいきます。

spec/requests/user/users_controller_spec.rb
RSpec.describe User::UsersController, type: :request do
  let!(:user) { create(:user, :context_hoge) }
  # ...
end

余談

validation_context は以下の記事のようなハマりどころもあるので、使わないで済むなら、使いたく無いなぁ。

参考

2
0
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
2
0