indilog

Ruby/Rails/React/Goなどに関して自分が勉強したことなどを投稿しています

STIを利用している場合のFactoryBotのfactory定義について

STIを活用しているモデルは、スーパークラスでfactoryを定義して、テストでオブジェクトの比較をすると、スーパークラスのままのものと、 サブクラスに変換されているものとの比較になってしまうことがあり、そのためテストが落ちることがある

以下のように書くことによって、typeを元にSTIのクラスを取得し、それを使ってオブジェクトが初期化できるようになる

FactoryBot.define do
  factory :factory_name do
    initialize_with do
      klass = type.constantize
      klass.new(attributes)
    end

    # 以下factoryの定義
  end
end