RailsのバージョンアップのためにRSpecテストを書いたのでメモメモ

どうもこんにちは。

今回は以前投稿した[こちら](https://qiita.com/PDC-Kurashinak/items/3e708bff8b5d07eedc02)の記事の派生で、RSpecテストについて記載します。

https://qiita.com/PDC-Kurashinak/items/3e708bff8b5d07eedc02

# RSpecってどんなやつ？

RSpecテストとは、Railsのモデル、ビュー、コントローラなどのコードを実際に動かしているかのように **動的なテスト** をしてくれるツールです。

（コーディング規約に反していないかチェックするツールとしてRuboCopというツールがありますが、別の記事でメモしました。）

https://qiita.com/PDC-Kurashinak/items/1de32b66d95c705f5b82

# RSpecのメリット

- 書いたコードのエラーを自動で発見することができる
- Railsをバージョンアップさせたときに実行すれば、修正の必要箇所がよくわかる

# RSpecのデメリット

- 自分でテストコードを書かなければならない

テストコードを書くのがかなり時間がかかります。。。

# 導入方法

最低限のRailsアプリケーションが構築されている状態であると仮定して説明を進めます。

## 1. Gemを追加する。

Gemfileに以下のコードを記述します。

```gemfile
group :development, :test do
    gem 'rspec-rails', '~> 5.0'
    gem 'factory_bot_rails'
    gem 'faker'
    gem 'capybara'
    gem 'database_cleaner-active_record'
    gem 'simplecov'
end
```

- factory_bot_rails・・・テストデータを簡単に作成するためのライブラリ
- faker・・・ランダムなテストデータを生成するためのライブラリ（メールアドレスなど）
- capybara・・・システムテストやフィーチャーテストを書くためのライブラリ
- database_cleaner-active_record・・・テストの前後でデータベースをクリーンに保つためのライブラリ
- simplecov・・・RSpecテストのカバレッジを測定、可視化するためのライブラリ

## 2. bundle installの実行

ターミナルで`bundle install`を実行します。

## 3. RSpecの初期設定

ターミナルで`rails g rspec:install`を実行します。
これを実行すると、`.rspec`、`spec/spec_helper.rb`、`spec/rails_helper.rb`が自動生成されます。

## 4. 設定の調整

### `.rspec`ファイル

`.rspec`ファイルに以下のコードを記述します。

```
--require spec_helper
--format documentation
```

### `spec/rails_helper.rb`ファイル

`spec/rails_helper.rb`ファイルに以下のコードを記述します。

```ruby
# deviseを導入している場合には必要
config.include Devise::Test::IntegrationHelpers, type: :request

# FactoryBotのメソッドを簡単に使用するためのコード
config.include FactoryBot::Syntax::Methods
```

`config.include FactoryBot::Syntax::Methods`については別の記事でメモします。

## 5. SimpleCovの設定

`spec/spec_helper.rb`の先頭に以下のコードを追加します。

```ruby
require 'simplecov'
SimpleCov.start
```

## 5. テストの記述

最初は、アクション1つにつきテスト１つのテストを書いていきます。（最初はUsersコントローラのテストを書くのがおすすめです。）

## 6. テストの実行

ターミナルで以下のコマンドを実行します。

```
bundle exec rspec
```

実行結果はターミナルに出力されます。テストが全て成功するまでテストコードを追加・修正をしていきます。

この時に、`coverage`ディレクトリが自動生成されます。ブラウザで`coverage/index.html`を開くと以下の画像のようなページが閲覧できます。

![covorage一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/e4355b32-1726-6822-e762-b30a839863ee.png)

ここで確認すべきは、`app/controllers/users_controller.rb`などのコントローラやモデルファイルのコード全てをカバーできているかどうかです。それは、カバレッジ一覧画面の`app/controllers/users_controller.rb`をクリックして確認してみてください。以下のようにファイルごとのカバレッジが確認でき、どのコードがカバーされていないかまで確認することができます。

![ファイルごとカバレッジ例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/1a78bb4f-d944-f93c-1271-a3f9a7bb1484.png)

# ちょいめも

## 特定のテストコードだけ実行したいとき

特定のファイルだけのテストを実行したい場合は、以下のようにパスを指定します。

```
bundle exec rspec spec/requests/users_controller_spec.rb

## RSpecの実行結果をHTML形式で見たいとき
```

RSpecの実行結果をHTML形式で見たい場合は、`.rspec`ファイルに以下のコードを記述します。

```
--require spec_helper
--format html
--out spec/results/rspec_result.html
```

これで`bundle exec rspec`を実行すると以下のような画面が出てきます。

![スクリーンショット 2023-09-15 18.32.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/d98101fd-c0c0-f160-893f-a9ecd280c91b.png)

テストが成功しているときは緑、失敗した時は赤で結果が表示されます。もちろん、そのテストコードで失敗しているかも表示してくれます。

# まとめ

今回はRSpecテストについてメモしてみました。

RSpecはAPI通信とかもテストできるので便利だなぁと感じます。

テストコードを書くのはちょっと難易度高めですが。。。

以上