[Ruby on Rails]rspecを用いたmodelの単体テスト
備忘録として残します。
Gemのインストール
今回はrspecとFactoryBotというGemを用いてテストを行っていきます。
GemFileに以下の記述を行ってください。
gem 'rspec-rails'
gem 'factory_bot_rails'
FactoryBotはダミーのインスタンスを簡単に作成できるGemで、テストを書くスピードをあげることができます。
後ほど説明します。
記載したらbundle installしましょう。
$ bundle install
RSpecの設定
まずは以下コマンドを実行してください。
$ rails g rspec:install
このコマンドで作成された.rspecに以下の記述を行います。
--format documentation
上の記述はあってもなくてもいいのですが、あるなしでテスト実行時の表示がこのくらい変わります。
なし
$ ...............................
あり
$ User
$ #create
$ is valid
$ is invalid without email
$ is invalid without password
どういうテストを行ったのかがわかるようになります。
FactoryBotの設定
続いてFactoryBotの設定を行います。
今回はUserモデルのバリデーションをテストするものとします。
spec/factoriesディレクトリにusers.rbというファイルを作成し、以下の記述を行ってください。
FactoryBot.define do
factory :user do
nickname {"taro"}
email {"kkk@gmail.com"}
password {"00000000"}
password_confirmation {"00000000"}
end
end
また、specディレクトリのrails_helper.rbに
・
・
・
RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods #この一文を記述する
・
・
・
end
これを行うことで、テストの度に毎回インスタンスを作成する記述を行わなくて済みます。
テストを書く
準備が整ったのでテストを書いていきましょう。
spec/modelsディレクトリを作成し、その中にuser_spec.rbファイルを作成します。
user_spec.rbに以下の記述をします。
require 'rails_helper'
describe User do
describe '#create' do
it 'is valid' do
user = build(:user)
user.valid?
expect(user).to be_valid
end
end
end
requireでrails_helper.rbに記載した内容を読み込んでいます。
describeで囲うことで、テストをグループ化しています。
今回だとUserモデルにレコードをcreateする際のテストというのがわかりまます。
itで囲われた内容がテストになります。it~doの間に書かれている内容はテストの説明になります。日本語で書いても問題ありません。
テストの中身に入っていきます。
user = build(:user)
これがFactoryBotの恩恵です。
先ほどusers.rbに
factory :user do
nickname {"taro"}
email {"kkk@gmail.com"}
password {"00000000"}
password_confirmation {"00000000"}
end
という記述を行いました。
この内容のインスタンスをbuild(:user)で作成してくれます。
つまり
user = build(:user)
は
user = User.new(nickname: "taro", email: "kkk@gmail.com", password: "00000000", password_confirmation: "00000000")
と同じになります。
多くのテストを記述する場合、かなり記述が楽になります。
user.valid?
でバリデーションを確認します。そして
expect(user).to be_valid
このexpectで指定された値がtoメソッドで指定した内容と一致すればテスト成功となります。
バリデーションクリアしたかどうかを確かめるためにbe_validメソッドを使用しています。
もう一つテストを紹介すると
it 'is invalid without email' do
user = build(:user, email: "")
user.valid?
expect(user.errors[:email]).to include("can't be blank")
end
このテストは、emailカラムにpresence: trueのバリデーションがかかっているとして、emailに何も入力しなかった場合にバリデーションエラーが発生することを確かめるテストとなります。
このように起きてほしいことと起きて欲しくないことの両方をテストするようにしましょう。
まとめ
テストの記述って非常に重要だと思います。
大規模になればなるほど人手での確認は難しいですからね。
うっかりバリデーション書き忘れていた!とかの予防にもなります。
テスト駆動開発といって、テストを書いてから実際の開発コードを書き始めるような開発手法もあるようです。
テストの記述になれて、質の高い成果物を作成していきたいものです。
この記事が気に入ったらサポートをしてみませんか?