RSpecを導入する

##RSpecをインストール
```rb:Gemfile
group :development, :test do
  gem 'rspec-rails'
```
```terminal
$ bundle install
$ bin/rails generate rspec:install
You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.
   create  .rspec
   create  spec
   create  spec/spec_helper.rb
   create  spec/rails_helper.rb
```
`.rspec`(設定ファイル)、`spec/spec_helper.rb`、`spec/rails_helper.rb`が生成されます。

```rb:.rspec
--require spec_helper
--format documentation #この行を追加して出力の形式を変更
```
binstub をインストールしてテストスイートの起動時間を速くします。

```rb:Gemfile
group :development do
  gem 'spring-commands-rspec'
```
```terminal
$ bundle install
$ bundle exec spring binstub rspec
```
動作確認

```terminal
$ bin/rspec
```
テストが走って`No examples found.`的な記述が確認できればOK。
次に`rails generate`コマンドを叩いた時にテスト用ファイルが自動で生成されるように修正。

```config/application.rb
config.generators do |g|
  g.stylesheets false
  g.javascripts false
  g.helper false
  g.test_framework :rspec,
    fixtures: true,
    request_specs: false,
    controller_specs: false,
    view_specs: false,
    helper_specs: false,
    routing_specs: false
end
```
最後に`test`ディレクトリを丸ごと削除してセットアップ完了。

と思ったら、コマンドを叩くたびに`thor`とかいう、入れた覚えのないgemから以下のエラーが吐かれるようになってしまった。さっき追加した`spring`と依存関係にある、シェルスクリプトを生成するためのgemらしい。

```
Deprecation warning: Expected string default value for '--test-framework'; got false (boolean).
This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_incompatible_default_type!` in your code
You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.
```

指示通り環境変数をセットしてエラーを非表示に。dotenvのgemを使ってます。

```:.env
THOR_SILENCE_DEPRECATION = true
```

##FactoryBotをインストール
テストデータ生成用のGem`FactoryBot`をインストールします。

```rb:Gemfile
group :development, :test do
  gem 'factory_bot_rails'
```
```terminal
$ bundle install
```
`FactoryBot.create(:user)`→`create(:user)`と書けるように設定を追加。

```spec/rails_helper.rb
RSpec.configure do |config|
.
.
  config.include FactoryBot::Syntax::Methods
end
```
```config/application.rb
config.generators do |g|
  g.stylesheets false
  g.javascripts false
  g.helper false
  g.test_framework :rspec,
    fixtures: true,
    request_specs: false,
    controller_specs: false,
    view_specs: false,
    helper_specs: false,
    routing_specs: false
  g.fixture_replacement :factory_bot, dir: 'spec/factories' # 追加
end
```

##Capybaraをインストール
統合テスト用のGem`capybara`と、関連するGemをインストールします。

```rb:Gemfile
group :test do
  gem 'capybara'
  gem 'webdrivers'
  # gem 'selenium-webdriver'
  # gem 'chromedriver-helper'
end
```
`selenium-webdriver`、`chromedriver-helper`は不要なので、もし書いてあったら削除します。

```terminal
$ bundle install
```
`rails_helper.rb`を開き、以下の行をコメントアウトして有効化します。

```spec/rails_helper.rb
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
```
これで`spec/support`にRSpec関連の設定ファイルを配置することができます。
最後にcapybara用の設定ファイルを作成します。

```spec/support/capybara.rb
Capybara.javascript_driver = :selenium_chrome_headless
```

##shoulda-matchersをインストール
マッチャーを拡張するgem`shoulda-matchers`をインストールします。

```rb:Gemfile
group :test do
  gem 'shoulda-matchers'
end
```
```terminal
$ bundle install
```
`rails_helper.rb`を開き、以下の記述を追加。

```spec/rails_helper.rb
RSpec.configure do |config|
.
. 
end
Shoulda::Matchers.configure do |config|
  config.integrate do |with|
    with.test_framework :rspec
    with.library :rails
  end
end
```

##参考
- [Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)
- [【Rails】『RSpec + FactoryBot + Capybara + Webdrivers』の導入＆初期設定からテストの書き方まで](http://vdeep.net/rubyonrails-rspec-factorybot-capybara)