今回はRSpecでのテストコードの書き方を簡単に紹介します。
初心者用の記事ですので該当者以外は他の記事を読むことをおすすめします。
本記事の内容はこちら
- RSpecでテストコードを書く準備をする
- 基本的なテストコードの書き方を学ぶ
- テストコードの実装方法
それでは早速みていきましょう。
RSpecでテストコードを書く準備をする
作成しているアプリケーションRSpecのGemを追加します。
✔︎Gemの追加
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 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には実際の挙動を指定し、マッチャには想定している挙動を記述します。代表的なマッチャにはincludeとeqマッチャの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を実行して”どんなエラーが出るか”の部分に想定したものが表示されればテストは成功しています。
今回はの記事はここまでになります。今後もプログラミングの初心者講座情報を提供していきますのでご覧になってください。
コメント