Everyday Rails - RSpecの導入

#はじめに
RSpecの基礎的な構文は分かったので、いざ手を動かそうと思い[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)に挑戦してみたものの、書籍についているサンプルコードが導入できない。

ちょうど、久々のエラーだったので記事を作りつつエラーの解決をしてみる。

#実行環境
[【2019年10月版】「Everyday Rails - RSpecによるRailsテスト入門」のセットアップ解説動画を作成しました](https://blog.jnito.com/entry/2019/10/15/085932)
こちらの説明の通りに環境を合わせていく。
> 
 - Rails 5.1.1
 - RSpec 3.8.0（書籍の中では3.6.0が使われていますが、大きな違いはありません）
 - Ruby 2.4.9 （2019年10月14日時点のRuby 2.4系の最新版）

ちなみに自分の現行環境は下記の通り

```
rails -v
=> Rails 6.1.3.2

rspec -v
=> RSpec 3.10

ruby -v
=> ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-darwin20]

```

#セットアップ

とりあえず、[導入手順](https://blog.jnito.com/entry/2019/10/15/085932)の通りにリポジトリの複製から始める。

```
#GitHubのリポジトリからコードをローカルへ複製
git clone https://github.com/everydayrails/everydayrails-rspec-2017.git

# 複製したプロジェクトファイルへ移動
cd everydayrails-rspec-2017
```

次にRubyのバージョンを揃える

```
# Ruby2.4系をインストール
rbenv install 2.4.9

# プロジェクトファイルにRubyのバージョンを指定
rbenv local 2.4.9

# 導入できたか確認
ruby -v
=> ruby 2.4.9p362 (2019-10-02 revision 67824) [x86_64-darwin20]
````
Rubyは導入完了。
次にRailsのバージョンを揃える。

```
# Rails5.1系をインストール
gem install rails -v 5.1.1

=> Fetching: rack-2.2.3.gem (100%)
Successfully installed rack-2.2.3
Fetching: concurrent-ruby-1.1.8.gem (100%)
Successfully installed concurrent-ruby-1.1.8
Fetching: sprockets-4.0.2.gem (100%)
ERROR:  Error installing rails:
	sprockets requires Ruby version >= 2.5.0.
```
インストール失敗。どうやらRuby２.５.0以上が必要らしい。

```
# 2.5.0を指定してインストールしてみる。
rbenv install 2.5.0

Downloading openssl-1.1.1k.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5
Installing openssl-1.1.1k...
Installed openssl-1.1.1k to /Users/tanakahiroyuki/.rbenv/versions/2.5.0

Downloading ruby-2.5.0.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.0.tar.bz2
Installing ruby-2.5.0...

WARNING: ruby-2.5.0 is past its end of life and is now unsupported.
It no longer receives bug fixes or critical security updates.

ruby-build: using readline from homebrew
Installed ruby-2.5.0 to /Users/tanakahiroyuki/.rbenv/versions/2.5.0
```
サポートの対象外と警告が出ているが、一応インストールできたのでこのままでいってみる。

```
# Ruby2.5.0に切り替え
rbenv local 2.5.0

# 再度Rails 5.1.1 をインストール
gem install rails -v 5.1.1

=> Successfully installed rails-5.1.1
Parsing documentation for rails-5.1.1
Done installing documentation for rails after 0 seconds
1 gem installed
```
無事完了。
続いてgemのインストールを行う。

```
# gemのインストールを行う
bundle install

=>The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/.........
Your bundle is locked to mimemagic (0.3.2), but that version could not be found in any of the sources listed in your Gemfile. If you haven't changed sources, that means the author of mimemagic (0.3.2) has
removed it. You'll need to update your bundle to a version other than mimemagic (0.3.2) that hasn't been removed in order to install.
```
失敗。
いくつか見慣れない警告が出た。

`tzinfo-data`と`mimemagic(0.3.2)`に問題があるらしい。

[tzinfo-data](https://rubygems.org/gems/tzinfo-data/versions/1.2019.1?locale=ja)
[bundle installする際のtzinfo-dataのwarningがウザい](https://qiita.com/tatama/items/3f0f5e42cb5f75b53817)
>
tzinfo-dataはTZInfoが参照するタイムゾーン情報を提供するgem。
TZInfoはRubyからタイムゾーン情報を参照し、その情報に基づいて時間をコンバートするためのライブラリ。

[mimemagic](https://github.com/mimemagicrb/mimemagic)

とりあえず、警告に基づいてコマンドを実行してみる。

```
#警告文にあったコマンド
bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java

=> Could not find gem 'ruby (< 2.5, >= 2.0)', which is required by gem 'puma (~> 3.7)', in any of the relevant sources:
  the local ruby installation


#再度bundle install
bundle install
```
結果は変わらず。

こちらの[bundle installする際のtzinfo-dataのwarningがウザい](https://qiita.com/tatama/items/3f0f5e42cb5f75b53817)を参考に試してみる。

```Gemfile.
#下記の記述をコメントアウト
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```
根本の解決にはなっていないかもしれないが、とりあえず通ったのでよし。

残るはmimemagic (0.3.2)の解決。

どうやら、[mimemagicの最新動向](https://hackmd.io/@mametter/mimemagic-info-ja)に書かれている事だと、仕様の変更があったみたい。
>
Railsの一部であるactivestorageが依存しているmimemagic gemが、ライセンス関連の問題でrubygems.orgから取り下げられました。これにより、mimemagic <= 0.3.5に依存しているRailsアプリがbundle installに失敗するようになりました。

Railsのバージョンを上げるか、mimemagicのアップデートで解決するようなので、記事の通りにコマンドを叩いてみる。

```terminal
#macOSを使用しているのでこちらを叩く（shared-mime-info）
brew install shared-mime-info

#Gemfileにgemを追加
gem "mimemagic", "~> 0.3.10"

#アップデートをかける
bundle update mimemagic

#再度
bundle install
```
通った！
当初の環境構築に戻って続きをやる。

```
# マイグレーション実行
rails db:migrate

# サーバーを起動して動作確認（最初はSign up画面にてユーザーを作成）
rails s

# テストが全部パスすることを確認
bin/rspec 
```
無事、`rails s`までは正常に動作できた。

ただ`bin/rspec`が全てパスするはずなのだが、インスタンス変数の初期化がされいないと警告が出ている上に`70のテストを実行し、1つの失敗を確認`と出ているので正常ではなさそうだ。

```
#省略

Finished in 15.01 seconds (files took 3.52 seconds to load)
70 examples, 1 failure

Failed examples:

rspec ./spec/models/user_spec.rb:28 # User sends a welcome email on account creation
```
よく分からないが、心当たりがあるとすれば`gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]`をコメントアウトしたこと。

`platforms: [:mingw, :mswin, :x64_mingw, :jruby]`の部分だけコメントアウトして再度実行してみる。

```
#Gemfileの一部だけをコメントアウトに変更
gem 'tzinfo-data' #platforms: [:mingw, :mswin, :x64_mingw, :jruby]

#再度コマンドを叩く
bundle update
bundle install

#再度、テストの実行
bin/rspec

=>inished in 9.27 seconds (files took 0.6251 seconds to load)
70 examples, 0 failures
```
今回はサンプルアプリなので`bundle update`のコマンドを叩いたが、不具合を起こす可能性があるコマンドなので基本的には使わない方がいいものみたい。

とりあえず、導入できたようで安心。

ここまでやってきてなんだが、実は[【2019年10月版】「Everyday Rails - RSpecによるRailsテスト入門」のセットアップ解説動画を作成しました](https://blog.jnito.com/entry/2019/10/15/085932)にmimemagicの解決方法が書いてあったのを後になって気がついてしまった（笑


でもまあ勉強にはなったのでよし！

参考元
[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)
[【2019年10月版】「Everyday Rails - RSpecによるRailsテスト入門」のセットアップ解説動画を作成しました](https://blog.jnito.com/entry/2019/10/15/085932)
[tzinfo-data](https://rubygems.org/gems/tzinfo-data/versions/1.2019.1?locale=ja)
[bundle installする際のtzinfo-dataのwarningがウザい](https://qiita.com/tatama/items/3f0f5e42cb5f75b53817)
[mimemagic](https://github.com/mimemagicrb/mimemagic)
[mimemagicの最新動向](https://hackmd.io/@mametter/mimemagic-info-ja)