Modelの設定
UserモデルとFundモデルがあり、Userモデルは複数のFundモデルを持つ関連付けの設定は以下のようになります。
オプションとして、Userモデルが削除されたときに関連するFundモデルも削除することとします。
app/models/user.rb
オプションとして、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
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
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