binding.pryについて

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

### deviseを利用したユーザー新規登録のテストコード
#### 入力項目
* ニックネーム
* email
* password
* 名前（名字・名前）
* カナ（名字・名前）
* 生年月日
##### バリデーション
* すべての項目が必須である
* emailは@を含む
* 重複したemailは登録できない
* passwordとpassword_confirmationが一致する
* passwordは6文字以上
* passwordは半角英数字混合
* 名前は全角
* カナは全角カタカナ

##### Ruby on railsのテストコードを書くためのGem Rspecの導入

```ruby:Gemfile
group :development, :test do
  # 中略 
  gem 'rspec-rails', '~> 4.0.0'
  ```
group :development, :test doの中にgem 'rspec-rails', '~> 4.0.0'を記述。
 bundle installで実行。

##### アプリ内でRSpecを使うための設定
```ruby:ターミナル
% rails g rspec:install
```
##### テストコードの結果をターミナル上に可視化する
```ruby:.rspec
--require spec_helper
--format documentation
```
##### テストコードを記述するファイルを用意
```ruby:ターミナル
% rails g rspec:model user
```
```ruby: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はこれを導入していないと使えない。

```ruby: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ファイルを作成してインスタンスの各値を記述。
```ruby: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行目の記述はよくわからないまま検索して出てきた記事をそのまま記述しました。※

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

```ruby: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')**

```ruby: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　を実行します。
続けて以下を実行。
```ruby:ターミナル
[1] pry(main)> user.errors

[2] pry(main)> user.errors.full_messages
=> ["Nickname can't be blank"]
```
これで「ニックネームが空の時"Nickname can't be blank"というエラー文が表示される」ことが分かりました！

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