3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Rails] Rspecでテストコードの実装②

Last updated at Posted at 2021-05-02

#はじめに
テストコードの実装①をみていない方はこちらからご覧ください。

基本的なテストコードの書き方

まずは、どのような形でテストコードを書いていくのか確認です。
Userモデルにはnameカラムとemailカラムがあるとします。

spec/models/user_spec.rb
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で分けたグループのことを指します。

以上のような形で、どの機能のどんな状況のときにテストコードが実行されるのか、わかりやすい形でグループ分けしてやります。

#テストコードの具体的な実装(正常系)

それではグループ分けしたのちに、処理を実際に記述していきます。

spec/models/user_spec.rb
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

#テストコードの具体的な実装(異常系)
だんだん慣れてきたところで、異常系についてもさらっと触れておきましょう。

spec/models/user_spec.rb
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でテストコードの実装③

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?