🔰【初学者用】RSpecでテストコードを書こう！⑤【FactoryBot・Faker】

# はじめに
今回でテストコードについては最後の投稿になります。
前回までの投稿はこちら↓

①🔰【初学者用】RSpecでテストコードを書こう！【概念・準備】

https://qiita.com/hondano_gentuki/items/2003971a4f5a97481930

②🔰【初学者用】RSpecでテストコードを書こう！②【簡単な実装例】

https://qiita.com/hondano_gentuki/items/0a91a595df9c0d76f1cc

③🔰【初学者用】RSpecでテストコードを書こう！③【コントローラーの単体テスト簡単な実装例】

https://qiita.com/hondano_gentuki/items/7f5a36c08b9785022d33

🔰【初学者用】RSpecでテストコードを書こう！④【結合テストの簡単な実装例】

https://qiita.com/hondano_gentuki/items/ac52c47570c747f9a6d8

#　FactoryBot
テストコードを書く際に、`user = User.new(nickname: '', email: 'test@example', password: '000000', password_confirmation: '000000')`のような形でユーザーを生成する記述を都度記述していくのは大変ですよね。

そういう時に役立つのが`FactoryBot`という`Gem`になります。
まずは導入から！
```rails:Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails', '~> 4.0.0'
  gem 'factory_bot_rails' #追記
end
```
`group :development, :test do`内に記述します！
`bundle install`もお忘れなく！

次にFactoryBotの内容を記述する`factories`ディレクトリをspecディレクトリ内に作成します（手動でOK）。加えて、factriesディレクトリの中に`users.rbファイル`を作成します。(今回はuserにしてますが、投稿であればpost.rbのように、その都度変えてください。)

FactoryBot内に記述していきます。
```rails: spec/factories/users.rb
FactoryBot.define do
  factory :user do
    nickname              {'test'}
    email                 {'test@example'}
    password              {'000000'}
    password_confirmation {password}
  end
end
```
続いてここで作成した記述をテストコードに反映させます。
```rails: spec/models/user_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
  before do
    @user = FactoryBot.build(:user)
  end

  describe 'ユーザー新規登録' do
    it 'nicknameが空では登録できない' do
      @user.nickname = ''
      @user.valid?
      expect(@user.errors.full_messages).to include "Nickname can't be blank"
    end
    it 'emailが空では登録できない' do
      @user.email = ''
      @user.valid?
      expect(@user.errors.full_messages).to include "Email can't be blank"
    end
  end
end
```
3〜5行目のように記述することで`spec/factories/users.rb`内で記述した内容が`spec/models/user_spec.rb`ファイルにも生成されます。
```
before do
  @user = FactoryBot.build(:user)
end
```

### build
buildはActiveRecordのnewメソッドと同様の意味を持ちます。
つまりFactoryBot.build(:user) = user = User.new(nickname: 'test', email: 'test@example', password: '000000', password_confirmation: '00000000')ということ。これを見れば、どちらが効率的か明確ですね！笑

# Faker
続いてランダムな値を出力するFakerを使用していきます。
まずは導入から
```rails:Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails', '~> 4.0.0'
  gem 'factory_bot_rails'
  gem 'faker' #追記
end
```
忘れず`bundle install`
先程記述したspec/factories/users.rbを編集します！
```spec/factories/users.rb
FactoryBot.define do
  factory :user do
    nickname              {Faker::Name.initials(number: 2)}
    email                 {Faker::Internet.free_email}
    password              {Faker::Internet.password(min_length: 6)}
    password_confirmation {password}
  end
end
```
Fakerはランダムな値を生成してくれます。メールアドレス、人名、パスワードなど、さまざまな意図に応じたランダムな値を生成してくれます。他にもたくさん使い道はあるので調べてみましょう！

記入を終えたら下記コマンドでテストを実行してください。
```rails:ターミナル
bundle exec rspec spec/models/user_spec.rb 
```

# 終わりに
①〜⑤に渡りテストコードの簡単な使い方をまとめました。もっと深ぼらなければならない部分はたくさんありますが、簡単な流れだけは分かるのではないかと思います！
それではまた。