【初心者用】RSpecでのテストコードの書き方

今回はRSpecでのテストコードの書き方を簡単に紹介します。

 

初心者用の記事ですので該当者以外は他の記事を読むことをおすすめします。

 

本記事の内容はこちら

  • RSpecでテストコードを書く準備をする
  • 基本的なテストコードの書き方を学ぶ
  • テストコードの実装方法

それでは早速みていきましょう。

 

RSpecでテストコードを書く準備をする

作成しているアプリケーションRSpecのGemを追加します。

 

✔︎Gemの追加

Gemfile
1
2
3
4
5
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails', '~> 4.0.0'
end

上記のようにGemfileの group :development, :test do から始まる箇所に赤文字のものを追加しましょう。

ファイルへの記述が終わったらbundle installしましょう。

 

✔︎作成中アプリにRSpecをインストール

ターミナルでrails g spec:installコマンドを実行します。それによって追加された.rspecファイル(Gemfaileのちょっと上くらいにあります)に –format documentationと記述します。テストコードを可視化するために必要な記述です。

 

✔︎テストコードを記述するファイルを用意

rails g spec:model モデル名 とターミナルで実行してテストを行うためのファイルを作成します。作成されたファイルにが以下のようになっているか確認しましょう。

1
2
3
4
5
require 'rails_helper'

RSpec.describe モデル名, type: :model do
  pending "add some examples to (or delete) #{__FILE__}"
end

require ‘rails_helper’という記述はRailsの機能をテストする時に、共通のメソッドや設定を適応させるための記述です。各テストファイルごとにこれを記述します。(テストファイルを作成すると自動で記述されています。)

 

これでテストコードを書く準備は終了です。

 

 

基本的なテストコードの書き方を学ぶ

 

✔︎describeメソッドを使う

describeメソッドはテストコードをグループ分けする時に使用するメソッドです。どの機能に対してテストするのかという枠決めを行えます。書き方は以下を参照してください。

1
2
3
4
5
6
7
require 'rails_helper'

RSpec.describe モデル名, type: :model do
  describe "テストしたい機能名" do  #文字列で書いてOKです
  end
end

 ✔︎itメソッドとexampleメソッドを使う

itメソッドもグループ分けを行うメソッドですが、より詳細に分ける時に使用します。describeメソッドで指定した機能に対してどんなシチュエーションのテストを行うかを設定します。例えば「ユーザーが~~なことをした時」のように状況を選びます。

ちなみにitメソッドで分けられたグループをexampleとも呼びます。書き方は以下を参照に先ほど作成したmodelに追記しましょう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
require 'rails_helper'

RSpec.describe User, type: :model do
  describe "テストしたい機能名" do
    it "~~なことをした時" do
    end
    it "~~ができない場合" do
    end
  end
end

 

✔︎bundle execコマンドでテストコードを実行する

bundle exec はGem同士の関係性を整理してくれるコマンドです。続けてrspecコマンドも実行します。

1
% bundle exec rspec spec/models/モデル名_spec.rb 

先ほど作成したモデルを指定することでテストを実行することができます。

 

実行した後に先ほど記述した「~~なことをした時」「~~な場合はできない」などの記述が緑色に表示されたら実行成功です。
また、2 examples, 0 failuresのような表記が出ていれば問題なしです。errorが表記されればどこか記述にミスがあります。

 

 

異常系のモデル単体のテストの実装の流れ

  1. 保存するデータ(インスタンス)を作成する
  2. 作成したデータ(インスタンス)が保存されるかどうかを確認する
  3. 保存されない場合のエラーメッセージが意図したものかを確認する

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
require 'rails_helper'

RSpec.describe モデル名, type: :model do
  describe "テストしたい機能名" do
    it "~~が空だと登録できない" do
     モデル名 = モデル名.new(~~: "")←~~の部分に空の値を指定してインスタンスを生成します。
    end
    it "~~が空だと登録できない" do
    end
  end
end

 

空の値で登録できないようにするバリデーションはpresence: trueです。これが正常に機能するかどうかをこの後、検証していきます。

 

✔︎valid?メソッド
バリデーションを実行してエラーでない場合はtrue,エラーの場合はfalseを返すメソッドです。使い方は以下の通り

検証したいインスタンス名.valid?
(例)user.valid?  
=> false or true

 

上記のように意図した挙動と実際の挙動を確認して差異がないかを確認します。この確認をテストコードに落とし込んだものをexpectationと言います。

 

✔︎expectationとは

検証を行い、想定どおりの結果になるかを確認する構文のこと。記述の仕方はexpect().to matcherにテスト内容に応じて引数を変えます。

 

✔︎matcher(マッチャ)

「expectの引数」と「想定した挙動」が一致しているかどうかを判断すること。expectには実際の挙動を指定し、マッチャには想定している挙動を記述します。代表的なマッチャにはincludeeqマッチャの2つがあります。

 

✔︎Include

includeは含まれているかどうかを確認するマッチャです。書き方は以下のような感じです。

expect([“赤”, “青”, “黄”, “緑”]).to include(“緑”)  ←このように記述すると配列の中に緑が含まれていることが想定されているという文になります。実際に緑は含まれているのでテストは成功となります。

 

✔︎eq

eqは等しいことを確認するマッチャです。書き方は以下のような感じです。
expect(1 + 1).to eq(2) ←この結果はexpectとマッチャの値が等しいのでテストは成功します。

 

✔︎errorsメソッド
errorsは、インスタンスにエラーを示す情報がある場合、その内容を返すメソッド。

 

✔︎full_messagesメソッド
full_messagesは、エラーの内容から、エラーメッセージを配列として取り出すメソッドです。
少し情報過多で困惑するかと思います。以上を踏まえて先ほど作成したモデルに追記してみましょう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
require 'rails_helper'

RSpec.describe モデル名, type: :model do
  describe "テストしたい機能名" do
it "~~が空だと登録できない" do
     モデル名 = モデル名.new(~~: "")←~~の部分に空の値を指定してインスタンスを生成します。
   モデル名.valid?
     expect(モデル名.errors.full_messages).to include("どんなエラーが出るか")
end
it "~~が空だと登録できない" do
   end
  end
 end

 

最後にターミナルでbundle exec rspec spec/models/user_spec.rbを実行して”どんなエラーが出るか”の部分に想定したものが表示されればテストは成功しています。

 

今回はの記事はここまでになります。今後もプログラミングの初心者講座情報を提供していきますのでご覧になってください。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。