今回の記事ではRSpecでテストコードを記述していく前に、いろいろと準備をしていきます。
RSpecに関する他の記事はこちら
[Rails]RSpecでモデルのテスト(FactoryBot使用)
[Rails]RSpecでよく使うマッチャー10選
#開発環境
ruby 2.6.3
Rails 5.2.6
#前提
- FactoryBot使用
- Faker使用
- capybara使用
先にGemの説明を軽くしてから、実際にインストールして準備していきます。
#RSpecとは
Railsにおいて、とてもメジャーなテストフレームワークです。
Gemで導入ができて、コードが読みやすく、ドキュメントも豊富。
Railsで開発を行う現場でもRSpecを使用しているところが多いそうです。
#FactoryBotとは
テストデータの作成をサポートしてくれるGemです。
あらかじめ、テストデータを作っておいて、そのテストデータを使ってテストを実行できるので、テストコードを書く際にいちいちデータを作らなくてもFactoryBotを呼び出すだけで、データが使えるので、コードが簡素になります。
FactoryBotを使用するにはspec/factories/モデル名.rb
といった形でファイルを作成し、その中でテストデータを定義します。
FactoryBot.define do
factory :post do
title { Faker::Lorem.characters(number:5) }
body { Faker::Lorem.characters(number:20) }
end
end
これで、postモデルの
titleカラムが5文字のランダム文字列
bodyカラムが20文字のランダム文字列
のデータができました
(Fakerは次に説明します)
カラム名{ 値 }
の形で定義します。
で、このデータをFactoryBot.build(:モデル名)
の形で記述すると、対象モデルのデータを呼び出せます。
#Fakerとは
先ほどちらっと出てきたFakerはなにかというと、
テスト用のダミーデータを用意してくれるGemです。
# 5文字のランダム文字列
Faker::Lorem.characters(number:5)
# 20文字のランダム文字列
Faker::Lorem.characters(number:20)
こんな感じでダミーデータを作ることができます。
1つずつ見ていくと
Faker:: Fakerを使用する時の宣言
Lorem ダミーテキストタイプを指定
characters 文字列を作成
number 生成文字数の指定
という構成になっています。
Fakerは使う機会が多いので、覚えておきましょう。
#capybaraとは
テストを実行する際に実際にアプリケーションを操作しているかのようなテストが実行できます。
たとえば
①投稿ページに遷移
②フォームにhogeを入力
③送信ボタンを押す
④送信した後のリダイレクト先が一覧ページである
こんな感じで実際の流れを想定したテストが実行できます。
#Gemfileの編集
軽くGemについての説明が終わったので、Gemを追加していきます。
Gemfileのgroup :test do ~ end
部分のデフォルトの記述を削除して下記記述に変更してください。
:
group :test do
# 中身変更
gem 'capybara'
gem 'rspec-rails'
gem "factory_bot_rails"
gem 'faker'
end
:
変更できたらbundle installを行ってください
$bundle install
#RSpecの設定
RSpecを使用するために必要なフォルダやファイルをインストールします。
$rails g rspec:install
これでRSpecを使う準備ができました。
#FactoryBotにテストデータを定義
準備編の最後に、FactoryBotにテストデータを定義していきます。
テストデータの定義はご自身のモデル名、カラム名に置き換えて考えてみてください。
##手順
①specフォルダにfactoriesフォルダを作成
②対象モデルのファイルを作成
③テストデータの定義を記述
④あとあとのために設定
####①specフォルダにfactoriesフォルダを作成
RSpecを使う準備はできているのですが、FactoryBot用のファイルがないので、
specフォルダ配下にfactoriesフォルダを作成
してください。
####②対象モデルのファイルを作成
次に、ご自身のアプリで使用しているモデルごとのファイルをspec/actories配下
に作成してください。
今回は、
user.rb
post.rb
like.rb
comment.rb
contact.rb
を作成します。
####③テストデータの定義を記述
各モデルのファイルができたら、各モデルごとにテストデータを定義していきます。
注意点としては文字数のところで、バリデーションにかからないように定義してください。
email { Faker::Internet.email }
で実際のメールアドレスの形でデータを作成できます。(test@example.comみたいな感じ)
association モデル名
でアソシエーションも指定できます。
あとあとコントローラーのテストのときにアソシエーションしてると便利なので、つけておいてください。
以下記事参照
FactoryBotのassociationとは
では一気に定義したコードをのせていきます!
FactoryBot.define do
factory :user do
name { Faker::Lorem.characters(number: 5) }
# 実際のemailアドレスの形を指定
email { Faker::Internet.email }
password { Faker::Lorem.characters(number: 10) }
end
end
FactoryBot.define do
factory :post do
# userモデルアソシエーション
association :user
image_id { Faker::Lorem.characters(number: 10) }
content { Faker::Lorem.characters(number: 10) }
end
end
FactoryBot.define do
factory :like do
association :user
association :post
end
end
FactoryBot.define do
factory :comment do
# アソシエーションを定義
association :post
association :user
comment { Faker::Lorem.characters(number: 10) }
end
end
FactoryBot.define do
factory :contact do
name { Faker::Lorem.characters(number: 5) }
email { Faker::Internet.email }
content { Faker::Lorem.characters(number: 30) }
end
end
これでFactoryBotを使ったテストデータを定義できました。
この作ったテストデータを呼び出して、テストを行っていきます。
####④あとあとのために設定
あとあとのコントローラーテスト時にletを使用したときに、FactoryBotが使用できるように設定しておきます。
spec/rails_helper.rbの1番下のendの手前
に以下を記述してください。
:
# letを使用したときに、FactoryBotが使用できるように設定
config.include FactoryBot::Syntax::Methods
# endより上
end
以上でRSpecでテストを行う前の準備が完了です!
#まとめ
####RSpecの準備は
- Gemfileの編集
- RSpecインストール
####FactoryBotにテストデータを定義する手順は
①specフォルダにfactoriesフォルダを作成
②対象モデルのファイルを作成
③テストデータの定義を記述
④あとあとのために設定
今回の記事でRSpecでテストをする準備が完了したので、他記事で実際にテストコードを書いていきます。
RSpecに関する他の記事はこちら
[Rails]RSpecでモデルのテスト(FactoryBot使用)
[Rails]RSpecでよく使うマッチャー10選
はじめてRSpecを使う方、ひさびさにRSpecを使う方の参考になれば幸いです。