これはなに
RailsでのRSpec導入とテストコードの記述方法です。
初学者が備忘録のため書いています。ご指摘等あれば頂けると幸いです。
では、いきましょう!
Gemをインストール
group :development, :test do
gem 'rspec-rails'
gem 'factory_bot_rails'
end
group :development do
gem 'web-console', '>= 3.3.0'
end
bundle install
RSpecの基本設定
#RSpec用設定ファイルの作成
rails g rspec:install
#4つのファイルが作成されます
create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helper.rb
.rspecに以下を追記します。
--format documentation
RSpecを走らせるコマンドbundle exec rspec
で動作確認。
まだなにもテストコード書いてないので、0 examples, 0 failures
と出ます。
これで動作確認完了です。
$ bundle exec rspec
No examples found.
Finished in 0.00031 seconds (files took 0.19956 seconds to load)
0 examples, 0 failures
ファイル作成
次に、必要なファイルを作ります。
specフォルダ下に以下のように作成。モデルのテストなのでモデルのフォルダを作成。
- app
- spec
- models
- user_spec.rb
次にfactory_botのフォルダとファイルを作成します。
- app
- spec
- factories
-users.rb
これで必要なファイルは完成しました。
テストコード書き方
まず、factories/users.rb
のファイルを以下のように編集。
とりあえず進みます。
FactoryBot.define do
factory :user do
name { "abc" }
email { "aaa@bbb" }
password { "000000" }
password_confirmation { "000000" }
end
end
require 'rails_helper'
describe User do
describe '#create' do
it "nameがない場合は登録できないこと" do
user = build(:user, name: nil)
user.valid?
expect(user.errors[:name]).to include("を入力してください")
end
end
end
-
一行目の
require 'rails_helper'
は、rails_helper.rb内の記述を読み込むこんでいます。この1行目の記述は、全ての~_specファイルに書くと思って頂いて大丈夫です。 -
二行目の
describe User do ~ end
はUserモデルのテストであることを示しています。 -
三行目の
describe '#create' do ~ end
はcreateメソッド(ユーザー新規登録)であることを示しています。 -
四行目の
it "nameがない場合は登録できないこと" do ~ end
はテストの説明です。この間にテストコードを書いていきます。 -
user = build(:user, name: nil)
こちらは、buildメソッドでfactories/users.rbのuserを作成しています。作成した際、nameだけ空にしたいので、nameカラムを指定し、nilにしています。 -
user.valid?
こちらはbuildしたuserに対して、valid?
でバリデーションにより保存ができない状態であるか」を確かめることができます。 -
expect(user.errors[:name]).to include("を入力してください")
こちらは、valid?
メソッドを利用したuserに対してerrors
メソッドを利用し、なぜバリデーションにより保存ができないのかを確認することができます。
include
マッチャは引数にとった値が、expect
の引数である配列に含まれているかをチェックするマッチャです。
今回の場合、「nameがnilの場合は、を入力してください、というエラーが出るはずだ」ということがわかっているため、include("を入力してください")のように書くことができます。
実際にその通りになれば、このコードは意図した動作をすると確認出来ます。
実際にテストを実行してみましょう。
$ bundle exec rspec
〜省略〜
1 example, 0 failures
特に赤文字エラーが出てなく、0 failuresとなっていれば成功です!
以上です!
ありがとうございました!