前提
Rails、Rspec、factorybotを使ってレコードの重複を排除してテストデータを作成したいです。
記事(article)に対してカテゴリー(category)があるモデルでテストを書きたいと思っています。
作成したテーブルは下記の通りです。
- articles
- categories
- article_categories
articlesとcategoriesは多対多の関係で、中間テーブルとしてarticle_categoriesがあります。
実現したいこと
categoriesは既定の数だけ存在し、articlesは予め用意されたカテゴリーに所属するという形でテストデータを作成したいと思っています。
例えば、カテゴリーが["国内", "国際", "エンタメ", "IT", "速報"]の5つある場合、作成される記事はその5つのカテゴリーのどれかに属するという形にしたいです。
articlesが作成される度にcategoriesが増えるということを防ぎたいと思っています。
発生している問題・エラーメッセージ
後述するコードでテストデータを作成したところ、articleの数だけcategoryが作成されました。
該当のソースコード
モデル
ruby
1class Article < ApplicationRecord 2 has_many :article_categories 3 has_many :categories, through: :article_categories 4 5 validates :title, presence: true 6end 7 8class Category < ApplicationRecord 9 has_many :article_categories 10 has_many :articles, through: :article_categories 11end 12 13class ArticleCategory < ApplicationRecord 14 belongs_to :article 15 belongs_to :category 16end
factory
ruby
1FactoryBot.define do 2 factory :article do 3 title { 'タイトル' } 4 body { 'テキストテキストテキストテキストテキスト' } 5 6 after(:build) do |article| 7 category = create(:category) 8 article.article_categories << build(:article_category, article: article, category: category) 9 end 10 end 11end 12 13FactoryBot.define do 14 factory :category do 15 name { 'カテゴリー名' } 16 end 17end 18 19FactoryBot.define do 20 factory :article_category do 21 article 22 category 23 end 24end
テスト
ruby
1 context "記事の数をテストする" do 2 let!(:category){ create_list(:category, 5) } 3 let!(:article){ create_list(:article, 30) } 4 example "カテゴリーのレコード数を確認" do 5 expect(Category.all.count).to eq 5 6 end 7 end 8
試したこと
参照した記事です。
https://qiita.com/takehanKosuke/items/ae324483e7f9451bf6a7
補足情報(FW/ツールのバージョンなど)
- Ruby 2.6.7
- Rails 6.1
- rspec 3.10.0
ご教示のほどよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー