「テストとRSpec」について学習

##プログラミングにおけるテストとは？
「プログラムが意図した動作をするかを確かめる」こと。
テストをすることによって、事前にエラーになり得る箇所を発見し修正できたり、
要件の漏れを防止できる。

##RSpec
RSpecは、Rubyを元に作成されたテストに特化した言語。
`「rspec-rails」`というGemをインストールすると、RSpecを利用できる。
今回はRSpecを使用してテストを実施する流れを学習した。

##Railsでテストを行う流れ
**[1] Gemをインストール**
`gem 'rspec-rails'`と`web_console`の部分を追加。

```ruby:Gem&nbsp;file
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  ※省略
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'rspec-rails', '~> 4.0.0.beta2'
　※省略
end
group :development do
  gem 'web-console'
　※省略
end
```
必要箇所を記述したらターミナルで<br>`bundle install`入力。

[2] **RSpecの設定をする**
以下のコマンドでRSpec用の設定ファイルを作成。


**ターミナル**

```
% rails g rspec:install
```

以下のような画面になれば成功。

```
create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb
```

このコマンドを入力することでRSpecに必要な2つのファイルが自動で生成される。

**・rails_helper.rb**
`Rails`においてRSpecを利用する際に、共通の設定を書いておくファイルのこと。
各テスト用ファイルでこのファイルを読み込むことで、共通の設定やメソッドを適用できる。

**・spec_helper.rb**
rails_helper.rbと同じくRSpec用の共通の設定を書いておくファイルだが、こっちはRSpecを`Rails無し`で利用する際に利用する。

２つのファイルの作成が確認できたら、
アプリディレクトリ内の.`rspecファイル内`に以下の記述を追記する。

```
ruby:--format documentation
```
このオプションを記述することでRspecで
`出力する内容をキレイに表示`することができる。

**[3] RSpecが正常に利用できるか確認**

**ターミナル**

```
bundle exec rspec
```
以下のような結果になれば、RSpecを利用する準備はできている。

**ターミナル**

```
No examples found.


Finished in 0.00031 seconds (files took 0.19956 seconds to load)
0 examples, 0 failures
```

**[4] テストするファイルの作成**

・以下のようなイメージでディレクトリとファイルを用意する。
<img width="524" alt="3D6DB444-E813-4239-B552-A15B16EA83FD_1_105_c.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613200/906d30c3-106f-d715-d6b6-3a78e74bc4b3.jpeg">


**[５] factory_botの導入**
`factory_bot`とは、簡単にダミーのインスタンスを作成することができるGemのこと。
もっと簡潔に説明すると、Rspecで用いるテストデータの作成を楽にしてくれる役割を持つ。
したがって以下を参考にインストールしておくと良い。

```ruby:Gem&nbsp;file
group :development, :test do
  #省略
  gem 'rspec-rails', '~> 4.0.0.beta2'
  gem 'factory_bot_rails'
end
```
`⚠rspecと同じグループの中`に追記すること。
必要箇所を記述したらターミナルで`bundle install`入力。


**[6] テストコードを書く**
・テストコードの書き方(例）
以下の記述をもとに解説。（間違っているかもしれません）

```ruby:
①RSpec.describe Message, type: :model do
  ②describe '#create' do
    ③context 'can save' do
      it 'is valid with content' do
        ④expect(build(:message, image: nil)).to be_valid
      end

      it 'is valid with image' do
        ⑤expect(build(:message, content: nil)).to be_valid
      end

      it 'is valid with content and image' do
        ⑥expect(build(:message)).to be_valid
      end
    end
```

**①の処理**
Messageのモデルを対象をテストを行う宣言。

**②の処理**
Messageクラスのモデルのcreateメソッドが動いた時をテストの対象とする。

**③の処理**
データが保存できた場合に④〜⑥の条件でテストを行う。

**④の処理**
Messageモデルでインスタンスを生成し
imageカラムがnull(空)の条件でバリデーションが実行されるか確認

**⑤の処理**
Messageモデルでインスタンスを生成し
contentカラムがnull(空)の条件でバリデーションが実行されるか確認


**⑥の処理**
Messageモデルでインスタンスを生成し
全カラムにデータが入っている条件でバリデーションが実行されるか確認


**[6] テスト実行する**

**ターミナル**

```
bundle exec rspec spec/ファイル名/messages_controller_spec.rb
```

終了！！
＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊

参考記事
[「RSpecの使い分け」](https://qiita.com/uchiko/items/d34c5d1298934252f58f)

[「RSpecの基本的な機能を理解する」]
(https://qiita.com/jnchito/items/42193d066bd61c740612)