#はじめに
テストコードの実装①をみていない方はこちらからご覧ください。
基本的なテストコードの書き方
まずは、どのような形でテストコードを書いていくのか確認です。
Userモデルにはnameカラムとemailカラムがあるとします。
require 'rails_helper'
RSpec.describe User, type: :model do
describe 'ユーザー新規登録' do
context '登録ができるとき' do
it '全ての項目が正しく入力されている時' do
#その処理を記述
end
end
context '登録ができないとき' do
it 'nameが空では登録できない' do
# nameが空では登録できないテストコードを記述します
end
it 'emailが空では登録できない' do
# emailが空では登録できないテストコードを記述します
end
end
end
end
ひとつづつ確認しましょう。
###describe
describeとは、テストコードのグループ分けを行うメソッドです。
「どの機能に対してのテストを行うか」をdescribeでグループ分けします。
describeにつづくdo~endの間に、さらにdescribeメソッドを記述することで、入れ子構造をとることもできます。
###context
特定の条件を分けたい場合に用います。contextはどのような「状況」を確認したいのかを書きます。
###it
describeメソッド同様に、グループ分けを行うメソッドです。
itの場合はより詳細に、「describeメソッドに記述した機能において、どのような状況のテストを行うか」を明記します。contextよりもさらに詳細なものを記述します。
###example
exampleとは、itで分けたグループのことを指します。
以上のような形で、どの機能のどんな状況のときにテストコードが実行されるのか、わかりやすい形でグループ分けしてやります。
#テストコードの具体的な実装(正常系)
それではグループ分けしたのちに、処理を実際に記述していきます。
require 'rails_helper'
RSpec.describe User, type: :model do
describe 'ユーザー新規登録' do
before do
@user=User.new(name:"tochi",email:"abc@abc")
end
context '登録ができるとき' do
it '全ての項目が正しく入力されている時' do
expect(@user).to be_valid
end
end
#中略
end
end
こちらも1つづ解説します。
before do~end
これはコントローラーでいうbefore_actionと同様で、予め処理を走らす前に行いたい処理を記述します。今回は@userというインスタンスを作成しておきます。
###expect
検証で得られた挙動が想定通りなのかを確認する構文のことです。
expect().to matcher()という基本的な形をもとにに、テストの内容に応じて引数やmatcherを随時変えて記述します。のちに出てくるinclude等がこれにあたります。
######matcher(参考)
matcherは、「expectの引数」と「想定した挙動」が一致しているかどうかを判断します。
###be_valid
インスタンスが正しく保存されるかどうか判断します
以上を踏まえると、以下の一文は、@userがちゃんとDBに保存されたかどうかを確認します。
expect(@user).to be_valid
#テストコードの具体的な実装(異常系)
だんだん慣れてきたところで、異常系についてもさらっと触れておきましょう。
require 'rails_helper'
RSpec.describe User, type: :model do
describe 'ユーザー新規登録' do
#省略
context '登録ができないとき' do
it 'nameが空では登録できない' do
@user.name=""
@uer.valid?
expect(@user.errors.full_messages).to include("名前を入力してください")
end
it 'emailが空では登録できない' do
# 自分で考えてみよう!
end
end
end
end
新しく出てきたものがあるので解説します。
###valid?
valid?は、バリデーションを実行させて、エラーがあるかどうかを判断するメソッドです。
エラーがない場合はtrueを、ある場合はfalseを返します。
これを実施しないと、errorsが発生しないため、エラー文を引き出すことができません。
###errors
errorsは、インスタンスにエラーを示す情報がある場合、その内容を返すメソッド
###full_messages
full_messagesは、エラーの内容から、エラーメッセージを配列として取り出すメソッド。だいたい、errorsとセットで使います。
###include
includeは、「expectの引数」に「includeの引数」が含まれていることを確認するマッチャです。
以上より、以下の処理は、nameカラムが空だったとき、エラーがあるかどうか確認して、発生したエラー文に「名前を入力してください」と出るかどうかを確認しているということになります。
@user.name=""
@uer.valid?
expect(@user.errors.full_messages).to include("名前を入力してください")
ちなみに、エラー文は日本語になっていないことがあるかと思いますので、どんなエラー文が出るかはbinding.pryで止めて確認してください。
#終わりに
お疲れ様でした。今回、簡単にモデルの単体テストについてまとめてみました。いかがでしたか。
やはり、実際に手を動かしてやってみることが一番いいと思いますので、是非やってみてください
つづき!!!↓
Rspecでテストコードの実装③