カリキュラムの中で何度かbinding.pryを使って確認する作業がありましたが、よくわからず・・・
今回アプリ実装の最終課題を進めている中で、ちょっと理解できる部分があったのでテストコードも含めてまとめます。
deviseを利用したユーザー新規登録のテストコード
入力項目
- ニックネーム
- password
- 名前(名字・名前)
- カナ(名字・名前)
- 生年月日
バリデーション
- すべての項目が必須である
- emailは@を含む
- 重複したemailは登録できない
- passwordとpassword_confirmationが一致する
- passwordは6文字以上
- passwordは半角英数字混合
- 名前は全角
- カナは全角カタカナ
Ruby on railsのテストコードを書くためのGem Rspecの導入
group :development, :test do
# 中略
gem 'rspec-rails', '~> 4.0.0'
group :development, :test doの中にgem 'rspec-rails', '~> 4.0.0'を記述。
bundle installで実行。
アプリ内でRSpecを使うための設定
% rails g rspec:install
テストコードの結果をターミナル上に可視化する
--require spec_helper
--format documentation
テストコードを記述するファイルを用意
% rails g rspec:model user
require 'rails_helper'
RSpec.describe User, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end
これで雛形ができているファイルが生成できた。
4行目はいらないので削除しておく。
FactoryBot・gimei・pry導入
FactoryBot:インスタンスをまとめておくことができる。
Faker:ランダムなデータを生成してくれる。
Gimei:Fakerでは補えない名前やフリガナを自動生成できる。
pry-rails:デバックツール。binding.pryはこれを導入していないと使えない。
group :development, :test do
# 中略
gem 'rspec-rails', '~> 4.0.0'
gem 'factory_bot_rails'
gem 'faker'
gem 'gimei'
gem 'pry-rails'
bundle installで実行。
spec/factories/users.rbファイルを作成してインスタンスの各値を記述。
FactoryBot.define do
factory :user do
transient do
person { Gimei.name }
end
nickname {Faker::Name.initials(number: 2)}
email {Faker::Internet.email}
password {"a1" + Faker::Internet.password(min_length: 6)}
password_confirmation {password}
birth_day {Faker::Date.backward}
last_name {person.last.kanji}
first_name {person.first.kanji}
last_kana {person.last.katakana}
first_kana {person.first.katakana}
end
end
※4.5行目の記述はよくわからないまま検索して出てきた記事をそのまま記述しました。※
ここからテストコードを記述していきます。
require 'rails_helper'
RSpec.describe User, type: :model do
before do
@user = FactoryBot.build(:user)
end
before doでFactoryBotを使用したインスタンスが各テストコードを実行する前に処理されるようにする。
@user = FactoryBot.build(:user)
↑↑ buildはnewメソッドと同等の意味 ↓↓
user = User.new(nickname: 'test', email: 'test@example', password: '000000', password_confirmation: '00000000')
require 'rails_helper'
RSpec.describe User, type: :model do
before do
@user = FactoryBot.build(:user)
end
describe 'ユーザー新規登録' do
context '新規登録できないとき' do
it 'nicknameが空では登録できない' do
@user.nickname = ''
@user.valid?
binding.pry
やっとここでbinding.pryの登場!
ここで使った意味は、この後「ニックネームが空なので登録できないはず。その時に出るエラー文はなんだ?」という状況だからです。
まずターミナルで bundle exec rspec spec/models/user_spec.rb を実行します。
続けて以下を実行。
[1] pry(main)> user.errors
[2] pry(main)> user.errors.full_messages
=> ["Nickname can't be blank"]
これで「ニックネームが空の時"Nickname can't be blank"というエラー文が表示される」ことが分かりました!
require 'rails_helper'
RSpec.describe User, type: :model do
before do
@user = FactoryBot.build(:user)
end
describe 'ユーザー新規登録' do
context '新規登録できないとき' do
it 'nicknameが空では登録できない' do
@user.nickname = ''
@user.valid?
expect(@user.errors.full_messages).to include("Nickname can't be blank")
end
binding.pryを消してエクスペクテーションを記述すれば完成です!
今後もテストコードは何度も記述する場面があるので今回覚えたbinding.pry使っていきます!
別の場面でいつ使うかはまだよくわかりませんが、いったん処理を止めて確認したい時があれば使ってみようと思います!