RailsにRSpecを導入する方法とやさしい解説

## はじめに
Railsを書き始めて5ヶ月目にしてテストフレームワークであるRSpecを業務で書くことになった。書き方を調べたり先輩に聞いたりしながら実際に書ける状態にするまですこし手こずったので記録しておく。


## 環境
Ruby 2.5.1
Rails 5.1.6
Rspec 3.8


## rspec-railsというgemを追加

Gemfileのtestグループの中に `rspec-rails` というgemを追加。

```gemfile
# Gemfile

group :development, :test do
  gem 'rspec-rails'
end
```

追加したらBundle installする。

```terminal

$ bundle install
```

これでRSpecがRailsプロジェクト内で使用可能になった。

## RailsプロジェクトにRSpecをinstallする。

コマンドでrspecの設定用ファイルを生成できる。

```terminal
$ rails g rspec:install
Running via Spring preloader in process 16410
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```

RSpecのファイルが生成される。


これでRSpecでテストを走らせることのできる環境が整った。



## テストの実行方法

まだ何もテストを書いてない状態だけど、`$ rspec` というコマンドを打つことでテストを実行することが出来る。

```terminal
$ rspec
No examples found.


Finished in 0.00049 seconds (files took 0.1189 seconds to load)
0 examples, 0 failures
```

まだexamples(テストする項目)はないので`No examples found.` となるが、ひとまずテストを走らせることが出来た。


## テストファイルの生成方法

RSpecではテストコードのことをスペックと言う。
例えばModelのテストコードはModelSpec、ControllerのテストコードはControllerSpecと呼ばれる。

それぞれのスペックのファイル名は、**対象のファイル名_spec.rb**と命名する。

Railsの場合、`$rails g rspec:(model,controller,viewなど) ファイル名  ` とすることで必要最低限のテンプレートが書かれた状態でファイルが生成出来る。

ex. UserモデルのModelSpecを生成したい場合

```terminal
 $ rails g rspec:model user
Running via Spring preloader in process 17745
      create  spec/models/user_spec.rb
```


## 生成されたスペックの詳細


```spce/models/user_spec.rb

require 'rails_helper'

RSpec.describe User, type: :model do
  pending "add some examples to (or delete) #{__FILE__}"
end

```

コマンドで生成されたSpecファイルにはデフォルトでこんなコードが書かれている。

まず、`require 'rails_helper' ` をしている。
これは、`$ rails g rspec:install ` した際に生成された `#spec/rails_helper.rb` を読み込む為の設定。

このファイルが何をするためのものかというのはこちらのブログが解説しているので良かったら参考にしてみてください。

参考リンク：
[RSpec 3 時代の設定ファイル rails_helper.rb について - おもしろwebサービス開発日記](https://blog.willnet.in/entry/2014/06/10/142341)

続いては以下のブロックについて

```ruby
RSpec.describe User, type: :model do
  
end

```

ここではRSpecを書きますよ！という宣言をしていると思えば良い。
「User(モデル) のRSpecを書きます」 といったところだろう。


そしてそのブロックの中に

```ruby
pending "add some examples to (or delete) #{__FILE__}"
```
とあるが、ここでは、RSpecの書き方を解説している。

pendingというのは保留の意味で、実際にテストを書いていく際にまだテストをせずスキップさせたい際に使われる。

つまりここでは、 ` "add some examples to (or delete) #{__FILE__}" ` というテスト(仮)を保留としている。

なのでこのテンプレートが書かれたModelSpecが生成されてからもう一度 `$ rspec` を実行すると...

```terminal
$ rspec
*

Pending: (Failures listed here are expected and do not affect your suite's status)

  1) User add some examples to (or delete) /Users/kana_igarashi/shr-intern/pictgram/spec/models/user_spec.rb
     # Not yet implemented
     # ./spec/models/user_spec.rb:4


Finished in 0.00346 seconds (files took 3.99 seconds to load)
1 example, 0 failures, 1 pending
```

このように先程までの `No example` という結果とは変わって、なにやらいろいろと出てきた。

これは、`1 example, 0 failures, 1 pending` とあるように

- 1つのテストがあった
- 失敗したテストは0だった
- 1つ保留のテストがあった

という結果を表している。

これでテンプレートで生成されたコードは理解が出来た。

あとは実際にテストを書いていくことになる。

実際にテストを書いて行く場所は、`RSpec.describe User, type: :model do end` のブロックの中、つまりpendingで書かれているところに書いていく。 pendingのサンプルコードは残したままだとずっとテスト項目として実行されてしまうので消してから書くように気をつけよう。




## まとめ

RSpecはRailsの標準テストフレームワークでないものの最も使われているテストフレームワーク。Railsを書いているエンジニアなら初心者であってもテストを書く機会が比較的早い段階でやってくることも多いと思うので「まずはやってみる」くらいの気持ちでRSpecを使ってみる際にお役に立てば嬉しい。