LoginSignup
5
0

More than 3 years have passed since last update.

【rails】RSpecによる単体テスト(モデル)

Last updated at Posted at 2020-05-09

Rspecを用いることでアプリケーションの単体の機能をテストすることができる。
今回は、モデルに登録したバリデーションを対象としてテストを行う。

テスト対象のバリデーション

以下では、モデルに記載されたバリデーションの動作テストを例として扱う。

次のとおり、userモデルにバリデーションが記載されていて、データ保存時に次の条件をチェックしている。
 ・nicknameカラムの値が入っていること
 ・nicknameカラムの値の長さが、最大6文字であること
 ・emailカラムの値が入っていること

app/models/user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :tweets
  has_many :comments

  validates :nickname, presence: true, length: { maximum: 6 }
  validates :email, presence: true
end

定義の準備

次にspecフォルダ配下にmodelフォルダを作成する。

user_spec.rbを作成する。

user_spec.rbにテスト内容を記載していく。

spec/model/user_spec.rb
require 'rails_helper'

describe User do
  describe '#create' do

    #validationにより、nicknameの値が入っていないデータの登録を弾くことができることをテストする
    it "nicknameがない場合は登録できないこと" do
      # nicknameが空のインスタンスを作成
      user = User.new(nickname: "", email: "kkk@gmail.com",password: "00000000", password_confirmation: "00000000")
      # 作成したインスタンスがバリデーションによって保存できないかチェックする
      user.valid?
      # チェックによって吐かれたエラーメッセージが、予期したものであるか確かめる
      expect(user.errors[:nickname]).to include("can't be blank")
    end

    #validationにより、emailの値が入っていないデータの登録を弾くことができることをテストする
    it "emailがない場合は登録できないこと" do
      # emailが空のインスタンスを作成
      user = User.new(nickname: "nick", email: "",password: "00000000", password_confirmation: "00000000")
      # 作成したインスタンスがバリデーションによって保存できないかチェックする
      user.valid?
      # チェックによって吐かれたエラーメッセージが、予期したものであるか確かめる
      expect(user.errors[:email]).to include("can't be blank")
    end
  end
end
example

次のまとまりをexampleと呼ぶ

it "exampleの説明" do
 ~ 
end
エクスペクテーション
expect(~).to ~
valid?メソッド

ActiveRecord::Baseを継承しているクラスのインスタンスを保存する際に、バリデーションで保存できないことを確認できる。

errorsメソッド

valid?を利用したインスタンスに対して使用すると、バリデーションに保存できない原因を確認することができる。

includeマッチャ

引数にとった値が、expectの引数である配列に含まれているかどうか、チェックできる。

上記で記載しているエラーメッセージ "can't be blank"はどのように調べれば良いか。

エラーメッセージの確認の仕方

terminal
# コンソール立ち上げ
$ rails c
# エラー発生用のインスタンスを用意する
> user = User.new(nickname: "", email: "kkk@gmail.com", password_confirmation: "00000000")
# 
> user.valid?
> user.errors
=> #<ActiveModel::Errors:0x00007fd36a321fc8
 @base=#<User id: nil, email: "kkk@gmail.com", created_at: nil, updated_at: nil, nickname: "">,
 @details={:nickname=>[{:error=>:blank}]},
 @messages={:nickname=>["can't be blank"]}> # エラーメッセージ 

テスト実行

terminal
bundle exec rspec
...
User
  #create
    nicknameがない場合は登録できないこと

User
  #create
    emailがない場合は登録できないこと

Finished in 0.21795 seconds (files took 3.02 seconds to load)
2 examples, 0 failures

0 failure が表示されれば成功

5
0
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
5
0