【Rails】RSpecを用いてテストを書くために準備する事

##はじめに
「[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E7%8F%BE%E5%A0%B4Rails&qid=1586706956&sr=8-2)」にて紹介されていた、RSpecでテストを記述していくための必要事項を備忘録的にまとめました。

※環境Rails5.1以降

##RSpecではシステムテストを使用することにする
####システムテスト(System Test)とは
　　・E2E(End-to-End)テストに相当し、ブラウザを通してアプリケーションの挙動を外部的に確認できる。
　　・テスト終了時にDBが自動でロールバックされる。
　　・テスト失敗時にスクリーンショット撮影し、ターミナルに表示してくれる。
　　・driven_byを使って、specごとにブラウザを簡単に切り替えられるようになる。
　　・重要度で言えば最も高いテストで、システムテストがあれば「いつの間にか特定の機能が動かなくなる不具合が紛れ込んでいて、ある日突然ユーザーがエラー画面を目にして問い合わせてくる」というような出来事が起きる可能性を減らす事ができる。
　　・`RSpecでは、System Spec呼ばれる。`

##System Specを書くために必要なgem
####RSpec
　　・RubyにおけるBDD(振舞駆動開発)のためのテスティングフレームワーク。
　　・動く仕様書として自動テストを書くという発想で作られており、要求仕様をドキュメントに記述するような感覚でテストケースを記述することができる。
　　・RSpecでテストを書く上では、Spec(仕様書)を書くという意識で書くといい。

####Capybara
　　・WebアプリケーションのE2E(End-to-End)テスト用フレームワーク。
　　・RSpecなどのテスティングフレームワークと組み合わせて使う。
　　・Webアプリケーションのブラウザ操作をシミュレーションできたり、実際のブラウザと組み合わせてJavaScriptの動作まで含めたテストを行う事ができる。
　　・人が手作業で確認していないようなブラウザ操作をCapybaraのDSLを使い、直感的に記述できる。
####FactoryBot
　　・テスト用データの作成をサポートするgemで、テスト用のデータを簡単に用意してテストから呼び出して使う事ができる。
　　・テスト用データを作成するための機能としてFixtureがあるが、FactoryBotの方がデータを効率よく定義できる。
　　・DSLを使ってデータを効率よく定義する事ができ、ActiveRecordモデルに実装したコールバックなどを直接的に活用して、データの状態やデータ間の関係性などを制御しやすくなっている。
<br>
##System Specを書くための準備

###RSpecのインストールと初期準備
　　__1：Gemfileにrspec-railsというgemを追加して、bundleコマンドを実行してインストールする。__
　　　・RSpecとRSpecのRails用の機能がインストールされる。
　　__2：「rspec:install」をgenerateコマンドで実行し、RSpecに必要なディレクトリや設定ファイルを作成する。__
　　　・ここで作成される「spec/spec_helper.rb」はRSpecの全体的な設定を書くためのファイル。
　　　・ここで作成される「spec/rails_helper.rb」はRails特有の設定を書くためのファイル。
　　__3：testディレクトリを削除する。__
　　　・Minitestを書く場合にはtestディレクトリ下にテストファイルを格納していくが、RSpecではspecというディレクトリ下にspecファイルを格納することになるため。

>```ruby:Gemfile
group :development, :test do
 .
 .
 .
 gem 'rspec-rails', '~> 3.7'
end
```

>```:ターミナル
$ bundle install
```

>```:ターミナル
$ bin/rails g rspec:install
   create .rspec
   create spec
   create spec/spec_helper.rb
   create spec/rails_helper.rb
```

>```:ターミナル
$ rm -r ./test
```

###Capybaraの初期準備
※Capybara自体はrails newした時のbundle installコマンドでインストールされる。

　　__1：RSpecでcapybaraを利用するための準備を行う。__
　　　・spec/spec_helper.rbファイルを開く。
　　　・RspecでCapybaraを扱うために必要な機能を読み込むために「require 'capybara/rspec'」という記述を追加する。
　　　・System Specを実行するドライバの設定をする。
　　　　　　➡︎ドライバとは、Capybaraを使ったSpecにおいて、ブラウザ相当の機能を利用するために必要なプログラムのこと。
　　　　　　➡︎System Specでは、処理が高速なので常にブラウザにHeadless Chromeを使うことにするので、「selenium_chrome_headless」をドライバとして設定する。

>```ruby:spec/spec_helper.rb
require 'capybara/rspec'
　
RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :solenium_chrome_headless
  end
```


###FactoryBotのインストール
　　__1：Gemfileにfactory_bot_railsというgemを追加し、bundleコマンドを実行してインストールする。__
　　　・テスト用のサンプルデータ作成用。

>```ruby:Gemfile
group :development, :test do
  .
  .
  .
  gem 'rspec-rails', '~> 3.7'
  gem 'factory_bot_rails', '~> 4.11'
end
```

>```ターミナル
$ bundle install
```

<br>
以上で準備が完了。
<br>
##参考
　[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E7%8F%BE%E5%A0%B4Rails&qid=1586706956&sr=8-2)