[Rails]RSpecでテストを行う準備(FactoryBot使用)

今回の記事ではRSpecでテストコードを記述していく前に、いろいろと準備をしていきます。

RSpecに関する他の記事はこちら
[[Rails]RSpecでモデルのテスト(FactoryBot使用)](https://qiita.com/nakachan1994/items/d869db15f8482ba70d02)
[[Rails]RSpecでよく使うマッチャー10選](https://qiita.com/nakachan1994/items/e9938d70b3f6345368b2)

#開発環境

> ruby 2.6.3
> Rails 5.2.6

#前提

- FactoryBot使用
- Faker使用
- capybara使用

先にGemの説明を軽くしてから、実際にインストールして準備していきます。

#RSpecとは

Railsにおいて、とてもメジャーなテストフレームワークです。
Gemで導入ができて、コードが読みやすく、ドキュメントも豊富。

Railsで開発を行う現場でもRSpecを使用しているところが多いそうです。

#FactoryBotとは

テストデータの作成をサポートしてくれるGemです。

あらかじめ、テストデータを作っておいて、そのテストデータを使ってテストを実行できるので、テストコードを書く際にいちいちデータを作らなくてもFactoryBotを呼び出すだけで、データが使えるので、コードが簡素になります。

FactoryBotを使用するには`spec/factories/モデル名.rb`といった形でファイルを作成し、その中でテストデータを定義します。

```rb:postの場合
FactoryBot.define do
  factory :post do
    title { Faker::Lorem.characters(number:5) }
    body { Faker::Lorem.characters(number:20) }
  end
end
```

これで、postモデルの
titleカラムが5文字のランダム文字列
bodyカラムが20文字のランダム文字列
のデータができました
（Fakerは次に説明します）

`カラム名｛ 値 ｝`の形で定義します。

で、このデータを`FactoryBot.build(:モデル名)`の形で記述すると、対象モデルのデータを呼び出せます。

#Fakerとは

先ほどちらっと出てきたFakerはなにかというと、
テスト用のダミーデータを用意してくれるGemです。

```rb:
# 5文字のランダム文字列
Faker::Lorem.characters(number:5)
# 20文字のランダム文字列
Faker::Lorem.characters(number:20)
```

こんな感じでダミーデータを作ることができます。

１つずつ見ていくと

Faker::　　Fakerを使用する時の宣言
Lorem　　ダミーテキストタイプを指定
characters　　文字列を作成
number　　生成文字数の指定

という構成になっています。

Fakerは使う機会が多いので、覚えておきましょう。

#capybaraとは

テストを実行する際に実際にアプリケーションを操作しているかのようなテストが実行できます。

たとえば
①投稿ページに遷移
②フォームにhogeを入力
③送信ボタンを押す
④送信した後のリダイレクト先が一覧ページである

こんな感じで実際の流れを想定したテストが実行できます。

#Gemfileの編集

軽くGemについての説明が終わったので、Gemを追加していきます。

Gemfileの`group :test do ~ end`部分のデフォルトの記述を削除して下記記述に変更してください。

```rb:Gemfile
:
group :test do
  # 中身変更
  gem 'capybara'
  gem 'rspec-rails'
  gem "factory_bot_rails"
  gem 'faker'
end
:
```

変更できたらbundle installを行ってください

```
$bundle install
```

#RSpecの設定

RSpecを使用するために必要なフォルダやファイルをインストールします。

```
$rails g rspec:install
```

これでRSpecを使う準備ができました。

#FactoryBotにテストデータを定義

準備編の最後に、FactoryBotにテストデータを定義していきます。
テストデータの定義はご自身のモデル名、カラム名に置き換えて考えてみてください。

##手順
①specフォルダにfactoriesフォルダを作成
②対象モデルのファイルを作成
③テストデータの定義を記述
④あとあとのために設定

####①specフォルダにfactoriesフォルダを作成

RSpecを使う準備はできているのですが、FactoryBot用のファイルがないので、
`specフォルダ配下にfactoriesフォルダを作成`してください。

####②対象モデルのファイルを作成

次に、ご自身のアプリで使用しているモデルごとのファイルを`spec/actories配下`に作成してください。

今回は、
user.rb
post.rb
like.rb
comment.rb
contact.rb
を作成します。

####③テストデータの定義を記述

各モデルのファイルができたら、各モデルごとにテストデータを定義していきます。

注意点としては文字数のところで、バリデーションにかからないように定義してください。

`email { Faker::Internet.email }`で実際のメールアドレスの形でデータを作成できます。（test@example.comみたいな感じ)

`association モデル名`でアソシエーションも指定できます。
あとあとコントローラーのテストのときにアソシエーションしてると便利なので、つけておいてください。
以下記事参照
[FactoryBotのassociationとは](https://qiita.com/johnslith/items/c0b2a9b8ce8770e5d317)

では一気に定義したコードをのせていきます！

```spec/user.rb
FactoryBot.define do
  factory :user do
    name { Faker::Lorem.characters(number: 5) }
    # 実際のemailアドレスの形を指定
    email { Faker::Internet.email }
    password { Faker::Lorem.characters(number: 10) }
  end
end
```

```spec/post.rb
FactoryBot.define do
  factory :post do
    # userモデルアソシエーション
    association :user
    image_id { Faker::Lorem.characters(number: 10) }
    content { Faker::Lorem.characters(number: 10) }
  end
end
```

```spec/like.rb
FactoryBot.define do
  factory :like do
    association :user
    association :post
  end
end
```

```spec/comment.rb
FactoryBot.define do
  factory :comment do
    # アソシエーションを定義
    association :post
    association :user
    comment { Faker::Lorem.characters(number: 10) }
  end
end
```

```spec/contact.rb
FactoryBot.define do
  factory :contact do
    name { Faker::Lorem.characters(number: 5) }
    email { Faker::Internet.email }
    content { Faker::Lorem.characters(number: 30) }
  end
end
```

これでFactoryBotを使ったテストデータを定義できました。
この作ったテストデータを呼び出して、テストを行っていきます。

####④あとあとのために設定

あとあとのコントローラーテスト時にletを使用したときに、FactoryBotが使用できるように設定しておきます。

`spec/rails_helper.rbの１番下のendの手前`に以下を記述してください。

```spec/rails_helper.rb
:
  # letを使用したときに、FactoryBotが使用できるように設定
  config.include FactoryBot::Syntax::Methods
# endより上
end
```

以上でRSpecでテストを行う前の準備が完了です！

#まとめ

####RSpecの準備は
>- Gemfileの編集
>- RSpecインストール

####FactoryBotにテストデータを定義する手順は
>①specフォルダにfactoriesフォルダを作成
>②対象モデルのファイルを作成
>③テストデータの定義を記述
>④あとあとのために設定

今回の記事でRSpecでテストをする準備が完了したので、他記事で実際にテストコードを書いていきます。
RSpecに関する他の記事はこちら
[[Rails]RSpecでモデルのテスト(FactoryBot使用)](https://qiita.com/nakachan1994/items/d869db15f8482ba70d02)
[[Rails]RSpecでよく使うマッチャー10選](https://qiita.com/nakachan1994/items/e9938d70b3f6345368b2)

はじめてRSpecを使う方、ひさびさにRSpecを使う方の参考になれば幸いです。