質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1729閲覧

factorybotを使ってレコードの重複を排除してテストデータを作成したい

study_code

総合スコア1

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/08/10 09:00

編集2021/08/10 09:07

前提

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

ご教示のほどよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2021/08/10 11:03

FactoryBotの記述が元の記事のままですよね。どうやって変更すればよいのか、ご自身で調査したり試してみましたか? リポジトリに使い方について記載されているので、やり方をただ聞くのではなく、まずは挑戦してみてはどうでしょうか。 https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md
study_code

2021/08/11 01:28

ご教示ありがとうございます。リポジトリを見たら自己解決しました。
guest

回答1

0

自己解決

公式リファレンスを読んだら自己解決しました。
categoriesがarticlesを持っているという考え方で作成しました
https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md

FactoryBot.define do factory :categories do factory :category_with_article_categories do transient do articles_count { 5 } end after(:create) do |category, evaluator| create_list(:article_categories, evaluator.articles_count, category: category) category.reload end end end end

投稿2021/08/11 01:28

study_code

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問