RSpecインストール時のチートシート＆よく使うgem

パーフェクトrails等を読んで学んだ内容をあとあと使えるよう自分用にまとめました。
ちなみにRSpecってのはRailsアプリケーションの開発におけるテストフレームワークのデファクトスタンダードです、ネットで調べれば容易に情報が得られます。
以下のRSpecについてとても勉強になる内容が日本語訳されていますので是非ご参照ください。
[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp/read)

テストの書き方は以下の投稿を参考にするといい感じ
[使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」]()
[使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」](http://qiita.com/jnchito/items/2e79a1abe7cd8214caa5)
[使えるRSpec入門・その3「ゼロからわかるモック（mock）を使ったテストの書き方」](http://qiita.com/jnchito/items/640f17e124ab263a54dd)
[使えるRSpec入門・その4「どんなブラウザ操作も自由自在！逆引きCapybara大辞典」](http://qiita.com/jnchito/items/607f956263c38a5fec24)

# 環境
ruby:ruby 2.3.1
rails:Rails 4.2.6
Rspec:3.5

# インストールするgem一覧
実際のところは`gem 'rspec-rails'`だけGemfileに追加すれば関連した他のrspec系のgemもインストールしてくれます。`bundle exec bundle install`も忘れずに、、、

**rspec-core**：
豊富なコマンドラインプログラム、柔軟でカスタマイズ可能なレポート、コード例を構成するAPIを提供するスペックランナー。バージョン：3.5

**rspec-expectations**：
コード例の期待される結果を表すための読みやすいAPIを提供します。バージョン：3.5

**rspec-mocks**：
複数のタイプの擬似オブジェクトを提供する二重フレームワークをテストし、仕様を実行する環境を厳密に制御できるようにします。バージョン：3.5

**rspec-rails**：
Railsの組み込みテストフレームワークの代わりにRSpecを使用してRuby on Railsアプリケーションをテストすることをサポートします。バージョン：3.5

※参考：http://rspec.info/documentation/ ←各Gemの概要については左記URLの記載をGoogle翻訳先生に貼った結果です。最近のGoogle翻訳すごーい。

# 入れると便利なgem一覧

**shoulda-matchers** : 
モデルのテストの際、バリデーション関連のテストコードを簡単に書けるようにしてくれる。
インストール後は以下の記載を`spec/rails_helper.rb`に追加する。
詳細は https://github.com/thoughtbot/shoulda-matchers を参照。

```spec/rails_helper.rb
  Shoulda::Matchers.configure do |config|
    config.integrate do |with|
      # Choose a test framework:
      with.test_framework :rspec

      # Choose one or more libraries:
      with.library :active_record
      with.library :active_model
      with.library :action_controller
      # Or, choose the following (which implies all of the above):
      with.library :rails
    end
  end
```

**factory_girl_rails** : 
テスト用のデータの作成を、各モデルの定義用ファイルを作成することにより、比較的簡単にできるようにしてくれる。factory_girl_railsがインストール済みの状態でインストールすると、同時にこいつの定義ファイルも作成してくれます。

データを作成する場合は `FactoryGirl.create(:モデル名)`のようなコマンドを使用しますが、RSpecのテストファイル内で短縮系`create(:モデル名)`を使用したい場合は以下のような記述を追加します。

```spec/rails_helper.rb
require 'support/factory_girl'
```
ファイルの追加も行います。

```spec/support/factory_girl.rb
RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end
```

**capybara** : 
エンドツーエンドテストの際に使用するデファクトスタンダードなgem。エンドツーエンドテストの意味はざっくり言うとクライアント→サーバの処理→出力までの一連の流れを確認するテスト。

capybaraはRailsとRSpecに対応しており、それらの設定を使用するためにも以下の記述を追加する必要があります。

```spec/rails_helper.rb
require 'capybara/rails'
require 'capybara/rspec'
```
詳しくは https://github.com/teamcapybara/capybara 参照

**poltergeist** : 
capybaraを使用したエンドツーエンドのテストを行う際に、Javascriptのテストもしたいという場合に使用するgem。Javascriptに対応したGUI環境を必要としないWEBドライバ。

インストールに際し、poltergeistが依存しているPhantomJSをインストールする必要がある。
Windowsならサイトからダウンロードしてインストーラーを実行、MacやLinuxならbrewとかyumとかでインストール。以下brewを使った場合。

```
brew install PhantomJS
```

capybaraでpoltergeistを使用する場合は設定ファイルへの記述が必要です。

```spec/rails_helper.rb
require 'capybara/poltergeist'
Capybara.javascript_driver = :poltergeist
```

詳しくは https://github.com/teampoltergeist/poltergeist 参照。

**database_cleaner** : 
テストを行う際にデータベースをきれいにしてくれるgem。seleniumやpoltergeistなどのドライバを利用してテストを行う場合はRailsのデータベーストランザクションによるデータベースのロールバックが使えない(別プロセス)ため、当該gemなどを使う必要がある。
使用する際はrails_helper.rb内でトランザクション機能をオフにし、データ削除に関する設定を記述します。poltergeistを使う場合はトランケーション、使わない場合はトランザクションでデータを削除します。

```spec/rails_helper.rb
  config.use_transactional_fixtures = false

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.append_after(:each) do
    DatabaseCleaner.clean
  end
```

# 設定ファイルの生成
以下のようにコマンドを実行すると設定ファイルが生成されます。

```
$ bundle exec rails g rspec:install
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```
[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp/read) より
>最初の行にある require 'rails_helper' に気をつけてください。そしてこれをタイプするのに慣れてください。今後すべてのスペックにこの行が含まれることになります。これはRSpec 3で新しく登場した内容です。以前のバージョンでは spec_helper と書いていました。Rails固有の設定はこのファイルに移動しています。その結果、 spec_helper はかなり小さくなりました。この内容は第9章でもう少し詳しく説明します。

以前は全てspec_helper.rbに記載していた内容を、RSpec 3 以降ではRailsに関する設定はspec/rails_helper.rb に、RSpecに関する設定はspec/spec_helper.rbに書くことになったらしいです。

基本的にテストコードを記述するファイルの行頭には必ず`require 'rails_helper.rb'`が入ります。

# モデルのテストファイル生成
下記のコマンドを実行することにより、モデルのテスト用のファイルが作成されます。`rspec-rails`がインストールされている状態でモデルを作成した場合は、モデルの作成と同時にテスト用ファイルが作成されるので下記コマンドは実行不要です。
**※eventはモデルの名称です。**

```
$ bundle exec rails g rspec:model event
      create  spec/models/event_spec.rb
```

テストの実行時は以下のコマンドを実行します。

```
$ bundle exec rspec spec/models/event_spec.rb
```

# コントローラのテストファイル生成
下記のコマンドを実行することにより、コントローラのテスト用のファイルが作成されます。
**※eventはモデルの名称です。**

```
$ bundle exec rails g rspec:controller events
      create  spec/controllers/events_controller_spec.rb
```

テストの実行時は以下のコマンドを実行します。

```
$ bundle exec rspec spec/controllers/events_controller_spec.rb
```


# ビューのテストファイル生成
下記のコマンドを実行することにより、ビューのテスト用のファイルが作成されます。
**※eventはモデルの名称、showはアクション名です。**

```
$ bundle exec rails g rspec:view events show
      create  spec/views/events
      create  spec/views/events/show.html.erb_spec.rb
```

テストの実行時は以下のコマンドを実行します。

```
$ bundle exec rspec spec/views/events/show.html.erb_spec.rb
```

# テストをまとめて実行
プロジェクトのルートディレクトリで以下のコマンドを実行するとまとめてテストを実行できます。

```
$ bundle exec rspec
```