RSpecを利用したテストコードの記述を学習する中で得た知見の記録を目的とした記事です。
#まずRspecとは
Rubyコードをテストする為にRubyで記述された「ドメイン固有言語」テストツールです。
Railsでは「rspec-rails
」というGem
を導入する事で、使用出来るようになります。
※この記事ではRspecの導入方法については触れません。
導入の目的は、テストコードが設計である事をプログラマーが意識する事と、テストコードの記述をスムーズに行う為です。
#Rspecのディレクトリ構造
RSpecで書かれたテストコードのファイルをspecファイルと呼びます。
アプリケーションのappディレクトリ以下にあるテスト対象となるモデルやコントローラーの位置に
対応させる形で、specフォルダ以下にディレクトリを配置します。
例:
spec/models/ spec/controllers/
また、specファイルの命名規則として、対応するクラス名_spec.rbと設定する必要があります。
テストコードについて
前置きが長くなりましたが、テストコードについて説明します。
describe "CalculationFunction" do
it "5 + 5は10になる事" do
expect(5 + 5).to eq 10
end
end
##describe
describe
は直後のdo〜end
までをグループ化して、テストのまとまりを作ります。describe
のあとの""にはテストの対象とするものを書きます。
##itとexample
it
はexample
と呼ばれる実際に動作するテストコードのまとまりを表します。itに続く""にはそのexample
の説明を書きます。
##エクスペクテーション
テストで評価される式の事です。it do〜end
の間に書きます。例ではexpect(5 + 5).to eq 10
の部分がエクスペクテーションです。また、eq
の部分をマッチャと言います。
##マッチャ
エクスペクテーションの中で、テストが成功する条件を示します。例では、eqマッチャ
を使用しており、「等しければ」という意味を持っています。
##to / not_to
expect(5 + 5).to eq 10
to
は「〜である事」を期待する際に使用します。
expect(5 + 7).not_to eq 10
逆に「~ではない事」を期待する際は not_toを使用します。
##includeマッチャ
x = [1, 2, 3]
expect(x).to include 1, 3
includeマッチャの引数にとった値が、expectの引数である配列に含まれているかをチェックする事が出来ます。
##be_validマッチャ
it "is valid with a nickname, email, password, password_confirmation" do
user = build(:user)
expect(user).to be_valid
end
expectの引数にしたインスタンスが、全てのバリデーションをクリアする場合にパスするマッチャです。
##matchマッチャ
引数に配列クラスのインスタンスをとり、expectの引数と比較するマッチャです。配列の中身の順番までチェックします。
##render_templateマッチャ
引数にシンボル型でアクション名を取り、引数で指定したアクションがリクエストされた時に自動的に遷移するビューを返します。