(備忘録)Everyday Rails 第2章「RSpecのセットアップ」

#「Everyday Rails - RSpecによるRailsテスト入門」
Railsを使用したアプリケーションを作成したものの、テストの記述が全然分からない、という状態になったので、RSpecの勉強をできる教材を探していたところ、なんと[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/dp/B077Q8BXHC/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1) (チェリー本)の著者が翻訳を手がけた本を発見しました。
[こちらのサイト](https://leanpub.com/everydayrailsrspec-jp)から購入できます！
販売方法はなんと、購入金額を自由に設定できるという、画期的なシステムでした(最低購入価格は＄19からですが)。
先日、なんとか1周は終わらせたのですが、全然理解できていない部分が多いので、復習がてらアウトプットしていきたいと思います！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824345/613a1a4d-bb09-66c5-f9a6-b9e5575dcef6.png)

#第1章　「イントロダクション」
第1章はイントロダクションということで、この本のアウトラインや著者の想いなどが書かれています。
##著者の思い
その中で、著者の考える基本的な信条というものがあり、
>・テストは信頼できるものであること
>・テストは簡単に書けること
>・テストは簡単に理解できること(今日も将来も)

と書かれており、また
>・とはいえ結局、一番大事なことはテストが存在することです。信頼性が高く、理解しやすいテストが書いてあることが大事な出発点になります。

とありました。
テストはどちらかと言うと、とっつきにくいイメージがあったので、学習することから逃げていた節もあったのですが、心を入れ替えてしっかりと取り入れていきたいと思います！

##サンプルコードについて
[GitHub](https://github.com/everydayrails/everydayrails-rspec-2017)からサンプルコードを入手できます。

#第2章　「RSpecのセットアップ」
早速、本に従って進めていきたいところですが、いきなり、「テストスイート」という聞いたこともない単語に出くわしました。
スルーしてもいいのですが、最初が肝心なので、調べてみました。
[テストスイート](https://www.itmedia.co.jp/im/articles/1111/07/news187.html#:~:text=test%20suite%20%2F%20%E3%83%86%E3%82%B9%E3%83%88%E3%82%B9%E3%82%A4%E3%83%BC%E3%83%88&text=%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E7%9B%AE%E7%9A%84%E3%82%84,%E3%81%AE%E5%AE%9F%E8%A1%8C%E5%8D%98%E4%BD%8D%E3%81%A8%E3%81%AA%E3%82%8B%E3%80%82)とは、
>ソフトウェアテストの目的や対象ごとに複数のテストケースをまとめたもの。自動化テストにおいては、テストの実行単位となる。
　ソフトウェアテスト（動的テスト）の最小単位はテストケースといえるが、実際にテスト作業ではいくつものテストケースを組み合わせることによって不具合をあぶり出したり、確率的に十分なテストを行ったという結論を出したりする。このような**テスト目的やテスト対象に応じて、多数のテストケースを束ねたもの**をテストスイートという。

らしいです。
僕は知りませんでしたので、勉強になりました。

##Gemfileのインストール
まずはRSpecをインストールする必要があります。

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

開発環境とテスト環境の両方で、rspec-railsを読み込みますが、本番環境では読み込みません。

##テストデータベースの作成

```ruby:config/database.yml
test:
  <<: *default
  database: db/test.sqlite3
```

接続可能なデータベースの作成を行います。
`$ bin/rails db:create:all`

##RSpecの設定
続いて、RSpecのインストールを行います。
`$ bin/rails generate rspec:install`

インストール時に作成された`.rspec`ファイルを以下のように変更すると、RSpecの出力がドキュメント形式になるので、非常に読みやすくなります。

```ruby:.rspec
--require spec_helper
--format documentation
```

##rspec binstubで起動時間の短縮を図る

```ruby:Gemfile
group :development do
  gem 'spring-commands-rspec'
end
```

`bundle install`後、新しいbinstubを作成します。
`$ bundle exec spring binstub rspec`

##RSpecを実行してみる
まだテストファイルは一個も作成していませんが、RSpecのインストールを確認する上でも、以下のコードで一度RSpecを起動してみるのがいいと思います。
`$ bin/rspec`

##ジェネレータの設定
今後、アプリを作成していく中で、`$ rails g`コマンドを使用してコードを追加する際に、RSpec用のテストファイルも同時作成できるように設定を変更します。

```ruby:config/application.rb
require_relative 'boot'
require 'rails/all'

Bundler.require(*Rails.groups)

module Projects
  class Application < Rails::Application
    config.load_defaults 5.1

    config.generators do |g|
      g.test_framework :rspec,
        fixtures: false,
        view_specs: false,
        helper_specs: false,
        routing_specs: false
    end
  end
end
```

`fixtures: false`　テストデータベースにレコードを作成するファイルの作成をスキップ
`view_specs: false`　ビュースペックを作成しないことを指定
`helper_specs: false`　ヘルパーファイル用のスペックを作成しないことを指定
`routing_specs: false`　`config/routes.rb`用のスペックファイルの作成を省略

##まとめ
これでRSpecのテスト実行するためのセットアップが整ったことになります。
色々と設定があって、大変ですね。
本によると、既存のtestディレクトリがあった場合は、`rails test`コマンドでテストの有無を確認し、必要ならRSpecへの移行を検討するべき、とのことでした。
あくまで準備段階が終わっただけですが、一苦労でした。