LoginSignup
0
0

binding.pryについて

Posted at

カリキュラムの中で何度かbinding.pryを使って確認する作業がありましたが、よくわからず・・・
今回アプリ実装の最終課題を進めている中で、ちょっと理解できる部分があったのでテストコードも含めてまとめます。

deviseを利用したユーザー新規登録のテストコード

入力項目

  • ニックネーム
  • email
  • password
  • 名前(名字・名前)
  • カナ(名字・名前)
  • 生年月日
バリデーション
  • すべての項目が必須である
  • emailは@を含む
  • 重複したemailは登録できない
  • passwordとpassword_confirmationが一致する
  • passwordは6文字以上
  • passwordは半角英数字混合
  • 名前は全角
  • カナは全角カタカナ
Ruby on railsのテストコードを書くためのGem Rspecの導入
Gemfile
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
テストコードの結果をターミナル上に可視化する
.rspec
--require spec_helper
--format documentation
テストコードを記述するファイルを用意
ターミナル
% rails g rspec:model user
spec/models/user_rspec.rb
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はこれを導入していないと使えない。

Gemfile
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ファイルを作成してインスタンスの各値を記述。

facutories/user.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行目の記述はよくわからないまま検索して出てきた記事をそのまま記述しました。※

ここからテストコードを記述していきます。

spec/models/user_spec.rb
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')

spec/models/user_spec.rb
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"というエラー文が表示される」ことが分かりました!

spec/models/user_spec.rb
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使っていきます!
別の場面でいつ使うかはまだよくわかりませんが、いったん処理を止めて確認したい時があれば使ってみようと思います!

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