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


プログラミングにおけるテストとは?

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

RSpec

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

Railsでテストを行う流れ

[1] Gemをインストール
gem 'rspec-rails'web_consoleの部分を追加。

Gem 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

必要箇所を記述したらターミナルで
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無しで利用する際に利用する。

2つのファイルの作成が確認できたら、
アプリディレクトリ内の.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] テストするファイルの作成

・以下のようなイメージでディレクトリとファイルを用意する。

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

Gem file
group :development, :test do
  #省略
  gem 'rspec-rails', '~> 4.0.0.beta2'
  gem 'factory_bot_rails'
end

⚠rspecと同じグループの中に追記すること。
必要箇所を記述したらターミナルでbundle install入力。

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

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の使い分け」

「RSpecの基本的な機能を理解する」