Active Record - 関連付けモデルのテスト方法

2019年11月20日 21:57

    Modelの設定

    UserモデルとFundモデルがあり、Userモデルは複数のFundモデルを持つ関連付けの設定は以下のようになります。
    オプションとして、Userモデルが削除されたときに関連するFundモデルも削除することとします。

    app/models/user.rb
    class User < ApplicationRecord
      ...
      has_many :funds, dependent: :destroy
    end
    app/models/fund.rb
    class Fund < ApplicationRecord
      ...
      belongs_to :user
    end

    Factoryの設定

    FactoryにはFactoryBotを使っています。
    UserモデルのFactoryは普通に記述します(関連付けによる特記はありません)。

    spec/factories/funds.rb
    FactoryBot.define do
      factory :fund do
        ...
        association :user
      end
    end

    テスト方法

    Userモデルが削除されたとき、関連するFundモデルも削除されることをテストします。
    フィーチャーテスト(システムテスト)でも同じようなテストをする気がしますが、モデルのテストではより簡単に以下のようにテストしました。

    spec/models/user_spec.rb
    RSpec.describe User, type: :model do
      ...
      describe 'association' do
        it 'delete funds when deleted a user associated it' do
          user = FactoryBot.build(:user)
          user.funds << FactoryBot.build(:fund)
          user.save
          expect{ user.destroy }.to change{ Fund.count }.by(-1)
        end
      end
    end
    FundモデルはFactoryが生成できることのテストのみを行いました。

    spec/models/fund_spec.rb
    RSpec.describe Fund, type: :model do
      it 'has a valid factory' do
        expect(FactoryBot.build(:fund)).to be_valid
      end
    end
    Userモデルが関連付いているかをテストする以下のようなテストをしてもいいかもしれません。
    RSpec.describe Fund, type: :model do
      ...
      it 'is associated user when created fund' do
        expect(FactoryBot.build(:fund).user_id).to eq 1
      end
    end

    関連記事

    関連記事はありません。