10.2 モデル・コントローラ・ビューのテスト
モデルのバリデーションのテスト
現在User
モデルは以下のように定義されています。email
カラムはpresence: true
のバリデーションが定義されています。
app/models/user.rb
class User < ApplicationRecord
has_many :posts
validates :email, presence: true
end
Rspec
でテストをするにはまずモデルのテストファイルを作成します。以下のようなファイルを作成します。
spec/models/users_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
before do
@user = build(:user)
end
describe 'バリデーション' do
it 'emailが空場合は不正な値である' do
@user.email = nil
expect(@user.valid?).to eq(false)
end
end
end
上の例のbefore
ブロックではテストで使うUser
のインスタンスを作成しています。before
はテストケースが実行される前に実行されます。
describe
ブロックに引数にはテストの対象について書きます。今回であればバリデーション
になります。
it
ブロックにはテストの期待する動作を記述します。今回であればemailが空場合は不正な値である
ということです。
it
ブロックの中では実際に@user
のemail
にnil
を代入して、今回テストする状態にしています。
expect
メソッドはテスト対象を検証するためのメソッドで、expect(実行した結果).to eq 期待する結果
という感じで記述します。
eq
はmatcher(マッチャー)
と言います。今回の場合であれば、「@user.valid?
はfalse
と等しい」と文章で表すことができます。
テストケースを実行するにはrspec
コマンドを利用します。
$ rspec spec/models/users_spec.rb
.
Finished in 0.01517 seconds (files took 2.26 seconds to load)
1 example, 0 failures
上のように出力されていればテストにパスしました。
モデルのメソッドのテスト
以下のようなemail
を大文字で返すuppercase_email
メソッド定義しました。このメソッドをテストしていきたいと思います
app/models/user.rb
class User < ApplicationRecord
def uppercase_email
self.email.upcase
end
end
以下のようにspec/models/users_spec.rb
に書きなおします。
spec/models/users_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
before do
@user = create(:user)
end
describe 'メソッド' do
it 'emailが大文字で返ってくること' do
expect(@user.uppercase_email).to eq(@user.email.upcase)
end
end
end
今回のテストでは@user.uppercase_email
で返されるemail
と@user.email.upcase
で返却されるemail
が等しいことが確認されればパスされます。
Webリクエストが成功したかテストする
spec/controllers/posts_controller_spec.rb
require 'rails_helper'
RSpec.describe PostsController, type: :controller do
before do
@post = create(:post)
get :show, id: @post.id
end
describe 'GET #show' do
it 'ステータスが200が返却される' do
expect(response).to have_http_status(:ok)
end
end
end
正しいオブジェクトが取得されたかテストする
spec/controllers/posts_controller_spec.rb
require 'rails_helper'
RSpec.describe PostsController, type: :controller do
before do
@post = create(:post)
get :show, id: @post.id
end
describe 'GET #show' do
it '正しいオブジェクトが取得される' do
expect(assigns(:post)).to eq(post)
end
end
end
正しいビューが表示されたかテストする
spec/controllers/posts_controller_spec.rb
require 'rails_helper'
RSpec.describe PostsController, type: :controller do
before do
@post = create(:post)
get :show, id: @post.id
end
describe 'GET #show' do
it '正しいビューが表示される' do
expect(response).to render_template :show
end
end
end
正しいページにリダイレクトされたかテストする
spec/controllers/posts_controller_spec.rb
require 'rails_helper'
RSpec.describe PostsController, type: :controller do
before do
post :posts, params: {
'post': {
title: 'タイトルです',
body: '本文です'
}
}
end
describe 'POST #create' do
it 'Postページにリダイレクトされる' do
post = assigns(:post)
expect(response).to redirect_to post_path(id: post.id)
end
end
end