記事概要
Ruby on Railsのモデル単体テストについて、まとめる
RSpec
まとめ(コマンド)
rspecコマンド
specディレクトリ以下に書かれたRSpecのテストコードを実行するコマンド
まとめ(テスト整理のメソッド)
describeメソッド
テストコードのグループ分けを行うメソッド
「どの機能に対してのテストを行うか」をdescribe
でグループ分けし、その中に各テストコードを記述する
contextメソッド
テストコードのグループ分けを行うメソッド
使用方法はdescribe
と同じだが、context
には特定の条件を指定する
itメソッド
テストコードのグループ分けを行うメソッド
「describe
メソッドに記述した機能において、どのような状況のテストを行うか」を明記する
example
it
で分けたグループのこと
まとめ(メソッド)
expectation
検証で得られた挙動が想定通りなのかを確認する構文のこと
雛形は、expect().to matcher()
matcher
「expectの引数」と「想定した挙動」が一致しているかどうかを判断する
どのような挙動を想定しているかを記述する
include
「expectの引数」に「includeの引数」が含まれていることを確認するマッチャ
# 配列の中に'メロン'が含まれていることを想定
expect(['りんご', 'バナナ', 'ぶどう', 'メロン']).to include('メロン')
eq
「expectの引数」と「eqの引数」が等しいことを確認するマッチャ
# 1 + 1という計算の結果が、2と等しいことを想定
expect(1 + 1).to eq(2)
be_valid
valid?
メソッドの返り値が、true
であることを期待するマッチャ
expectの引数に指定されたインスタンスがバリデーションでエラーにならない場合、valid?
の返り値はtrue
となる
@user = FactoryBot.build(:user)
expect(@user).to be_valid
#=> 「@user.valid?」の結果が"true"の場合、正常完了
#=> 「@user.valid?」の結果が"false"の場合、エラー発生
build
new
メソッドと同様の意味を持つ
# FactoryBotを利用しない場合
user = User.new(nickname: 'test', email: 'test@example', password: '000000', password_confirmation: '00000000')
# FactoryBotを利用する場合
user = FactoryBot.build(:user)
before
それぞれのテストコードを実行する前に、セットアップを行うこと
require 'rails_helper'
RSpec.describe モデル名, type: :model do
before do
# 処理(変数を受け渡す場合、インスタンス変数にする必要がある)
end
describe 'X' do
it 'Y' do
# before内の処理が完了してから実行される
end
it 'Z' do
# before内の処理が完了してから実行される
end
end
end
まとめ(単体テストのメソッド)
valid?メソッド
バリデーションを実行させて、エラーがあるかどうかを判断するメソッド
エラーがない場合はtrue
を返す
エラーがある場合はfalse
を返し、エラーの内容を示すエラーメッセージを生成する
user.valid?
errors
インスタンスにエラーを示す情報がある場合、その内容を返すメソッド
# 変数userに新規データを格納
[1] pry(main)> user = User.new(nickname: '', email: 'test@example', password: '000000', password_confirmation: '000000')
=> #<User id: nil, email: "test@example", created_at: nil, updated_at: nil, nickname: "">
# 変数userにバリデーションを実行し、エラーがあるかを判断
[2] pry(main)> user.valid?
User Exists? (0.4ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'test@example' LIMIT 1
=> false
# エラー情報を表示
[3] pry(main)> user.errors
=> #<ActiveModel::Errors [#<ActiveModel::Error attribute=nickname, type=blank, options={}>]>
full_messages
エラーの内容から、エラーメッセージを配列として取り出すメソッド
# 変数userに新規データを格納
[1] pry(main)> user = User.new(nickname: '', email: 'test@example', password: '000000', password_confirmation: '000000')
=> #<User id: nil, email: "test@example", created_at: nil, updated_at: nil, nickname: "">
# 変数userにバリデーションを実行し、エラーがあるかを判断
[2] pry(main)> user.valid?
User Exists? (0.5ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'test@example' LIMIT 1
=> false
# エラーメッセージを表示
[3] pry(main)> user.errors.full_messages
=> ["Nickname can't be blank"]
user.valid?
expect(user.errors.full_messages).to include("Nickname can't be blank")
Ruby on Railsまとめ