.save

セーブがしたいんです…

RSpec 外部キーを使っているモデルをテストする際の手順(factory_girl使用)

やり方まとめ
・外部キーを使っている場合、外部キーの先のレコードが存在しないと、テストで弾かれる。だから必要なレコードを定義する。

具体的に
messageテーブルに外部キーでuserとgroupを設定しているとする。
「messageが投稿できるかどうか」というテストを行うにあたっては、messageに紐づくべきuserとgroupのレコードが必要になる。
factory_girlにて、messageのテスト用インスタンスだけでなく、userとgroupのものも設定する必要がある。

手順

1、spec/factories にgroup.rb user.rb message.rb を作成する。

2、それぞれにテスト用のインスタンスを定義する。
EX
user.rb

FactoryGirl.define do

  factory :user do
    name "hoge"
    email "hogehoge@hogehoge"
    password "hogehogehoge"
  end

end

3つにそれぞれ定義する。

3、messageが投稿できるかどうかのテストコードを書く。
spec/models/message_spec.rb

require 'rails_helper'

describe Message do #Messageモデルのテストであることの宣言
  describe '#create' do

    it "is valid with a message" do #messageが存在していたら投稿できる
      user = create(:user)
      group = create(:group)
      message = build(:message, user_id: user.id, group_id: group.id)
      expect(message).to be_valid 
    end
  end
end

userとgroupをcreateしてDBに入れる→それをmessageで引っ張るという流れ。