はじめに
こんばんは。
はじめに白状するとこの記事は今日の未明に書いていた記事でした。
以下は、そのまま文章を変えないでいこうと思います。
秋の夜長とはよく言ったもので今日もこんな時間まで起きています。
今日は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
今度はちゃんと関連付けを表現してあげられたので、テストは無事通りました。
まだまだfactory_bot及びrspecを理解できてない
モデル同士の関連付けを行うこと自体は珍しくないので、より多くのケースを早く書けるように精進しなくてはと思いました。
Happy coding!