LoginSignup
8
6

More than 5 years have passed since last update.

factory_botのhas_manyアソシエーションの付け方について

Last updated at Posted at 2018-11-09

はじめに

こんばんは。
はじめに白状するとこの記事は今日の未明に書いていた記事でした。
以下は、そのまま文章を変えないでいこうと思います。
秋の夜長とはよく言ったもので今日もこんな時間まで起きています。
今日はfactory_botについてです。テンションは高くもなく低くもなくいきたいと思います。

この記事で書くこと

factory_botで has_mmany 関連付けをどうつけるのかというのをまとめる。

factory_bot

Github | 公式リポジトリ
もともとはfactory_girlだったのですが、名前を変えたようです。(確かに受け手によってはなかなかな名前だったと思います。

fixture、モックデータをつくるためのgemです。

関連付け

以下のようなモデルをテストするときのモックデータをつくる場合

class Animal < ApplicationRecord
  belongs_to :family
end

class Family < ApplicationRecord
  has_many :animals
end

## ここでは、Family(家族)には何匹かAnimal(動物)がいるかもしれないので、「1対多」の関係を表現しています。

モックデータを作成。

# spec/factories/families.rb
FactoryBot.define do
  factory :family do
    name { "のらねこ一家" }
    address { "隣町1丁目" }
    animal { FactoryBot.create(:animal) }
  end
end

FactoryBot.define do
  factory :animal do
    name { "ねずみさん" }
    age { "100" }
  end
end
# このコードは間違っています。記事の後半で修正していきます。
# 意気揚々とテストケースを書き、いざ実行。
RSpec.describe Family, type: :model do
  describe "#show" do
     context "when family is choiced," do
        let(:family) { create :family } # ここでエラー! orz
        it "render #show." do
          get :show, params: { id: family.id }
          expect(response).to be_success
        end
     end
  end
end

関連付けられた「Animalがない」といわれ、バリデーションに引っかかってテストはそもそも失敗。

公式を確認する。
Github | 公式リポジトリ factory_bot | Getting_started#associations
Github | 公式リポジトリ factory_bot | Getting_started#callback

# spec/factories/families.rb
FactoryBot.define do
  factory :family do
    name { "のらねこ一家" }
    address { "隣町1丁目" }
    after(:build) do |family|
      family.animal = FactoryBot.create(:animal)
    end
  end
end

FactoryBot.define do
  factory :animal do
    name { "ねずみさん" }
    age { "100" }
  end
end

今度はちゃんと関連付けを表現してあげられたので、テストは無事通りました。 :tada:

まだまだfactory_bot及びrspecを理解できてない

モデル同士の関連付けを行うこと自体は珍しくないので、より多くのケースを早く書けるように精進しなくてはと思いました。

Happy coding! :sleeping: :star:

8
6
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
8
6