BETA

RSpecのfeatureテストで、複数の商品のテストデータ作成を簡潔にする方法

投稿日:2020-05-17
最終更新:2020-05-17

はじめに

RSpecのfeatureテストで、複数の商品のテストデータ(それぞれ違う商品名)を作成する際に役立つ方法を紹介します。

いままで

下記のように各商品ごとに1つ1つテストデータを書いていました。

RSpec.feature "Hogehoge::Products", type: :feature do  
  given(:cap_taxon) { create :taxon, name: "Cap" }  
  given!(:caps_1) { create(:product, name: "Ruby Cap 1", taxons: [cap_taxon]) }  
  given!(:caps_2) { create(:product, name: "Ruby Cap 2", taxons: [cap_taxon]) }  
  given!(:caps_3) { create(:product, name: "Ruby Cap 3", taxons: [cap_taxon]) }  
  given!(:caps_4) { create(:product, name: "Ruby Cap 4", taxons: [cap_taxon]) }  
  given!(:caps_5) { create(:product, name: "Ruby Cap 5", taxons: [cap_taxon]) }  


(以下省略)  

変更後

n.times.collectを使うことで、1行で書けるようになりました!

RSpec.feature "Hogehoge::Products", type: :feature do  
  given(:cap_taxon) { create :taxon, name: "Cap" }  
  given!(:cap_product) { 5.times.collect { |i| create(:product, name: "Ruby Cap #{i}", taxons: [cap_taxon]) } }  


(以下省略)  

追記

以下、Qiitaにて伊藤さんからコメントをいただきましたので、追記します。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
@jnchito 2018-11-22 15:33(編集済み)

FactoryBotにはcreate_listというメソッドが用意されているので、これを使うとより簡単に書けるようになります。

FactoryBot.define do  
  factory :product do  
    sequence(:name) { |n| "Ruby Cap #{n}" }  
  end  
end  

# Spec  
RSpec.feature "Hogehoge::Products", type: :feature do  
  given(:cap_taxon) { create :taxon, name: "Cap" }  
  given!(:cap_products) { create_list :product, 5, taxons: [cap_taxon] }  

 # 以下略  

sequenceとcreate_listについてはこちらの公式ドキュメントを参考にしてみてください。

Sequences
Building or Creating Multiple Records

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

渋谷のスタートアップ企業で働くRailsエンジニアの技術ブログ Qiita: https://qiita.com/naocan

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう