Rspecを用いることでアプリケーションの単体の機能をテストすることができる。
今回は、モデルに登録したバリデーションを対象としてテストを行う。
テスト対象のバリデーション
以下では、モデルに記載されたバリデーションの動作テストを例として扱う。
次のとおり、userモデルにバリデーションが記載されていて、データ保存時に次の条件をチェックしている。
・nicknameカラムの値が入っていること
・nicknameカラムの値の長さが、最大6文字であること
・emailカラムの値が入っていること
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にテスト内容を記載していく。
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"はどのように調べれば良いか。
エラーメッセージの確認の仕方
# コンソール立ち上げ
$ 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"]}> # エラーメッセージ
テスト実行
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 が表示されれば成功