Rspecコードの基本形
Rspecの基本形は下記のようになります。
1 2 3 4 5 6 7 8 9 10 11 |
describe [テスト対象],type:[specの種類] do context [状態] do before do [事前準備] end it [仕様] do [期待動作] end end end |
RspecにはSystem SpecやModel Spec等様々なSpecの種類が存在しますが基本的にどのSpecを使う場合でも同じ感じで記述します。
構文の役割
Rspecの構文にはそれぞれ役割があるので把握しておきましょう。
describe
テスト対象の機能を記述します。
System Specでは
一連の操作により動作確認をしたい機能や処理の名前を記述します。
Model Specでは
モデルクラス名やメソッド名を記述します。
例
1 |
文字列に一致するメッセージを検索する |
context
テストの様々な条件の概要を記述します。Rspecではcontextはdescribeのエイリアスになっているのでdescribeの代わりにcontextを使ったとしても動作はします。
例
1 2 |
一致するデータが見つかる時 一致するデータが見つからない時 |
before
テストコードを実行する前にこちらに記述された内容を実行してくれるのでテストの「前提条件」を記述するために使います。describeの中に複数のテストケースを記述する場合はこちらに事前処理をまとめて記述すれば共通化にもなります。なお、beforeの処理は後続のitの処理が実行されるたびに実行されることになります。
また、beforeブロックの中で変数を使う場合はテスト全体でアクセスできる必要があるためローカル変数ではなくインスタンス変数(@付きの変数)にする必要があります。
after
テストの後処理を記述します。Rspecではデータベースの後片付けをデフォルトでやってくれるのでこのフックを使うことはほとんどありません。
it
期待する動作の詳細や条件を記載します。実際にテストコードとして具体的に記述するのはこのブロック内になります。こちらが期待通り動作すればテスト成功の集計が1件増加することになります。例外が発生した場合はエラー(Error)、例外は起きていないが想定外の場合は失敗(Failure)にカウントされます。
なお、DBの状態は次のitが実行される場合は元に戻されるため、あるテストケースの結果によって別のテストケースが影響を受けるということが無いようになっています。(逆に言えばテストデータは他のテストケースの影響を受けないこと前提で作る必要があります。)
itの中に記述するチェック内容
一例ですが、下記のように記述をします。
1 |
expect(page).to have_content '内容' |
expect(page)
というのがpageが画面のことを表していてpageに期待するという意味になります。RSpec2.10以前はshouldを使っていましたがメタプログラミングを使っておりバグが発生したためexpectに置き換わりました。
to_have_content '内容'
「内容」という内容がページ内にあるはずだということを指定します。これをRspecでは「マッチャ(Matcher)」といいます。
itの命名規則
英語で記述する場合は下記のように動詞から始めるのが通常のようです。
1 |
is invalid without a name(名前がなければ無効な状態である。) |
ネストさせる。
基本的に業務ではdescribe文をネストさせて下記のように階層構造でテストコードを記述することが一般的です。
1 2 3 4 5 6 7 |
describe '○○アプリ',type:system do describe '検索' do end describe '登録' do end end |
一番外側のdescribe
Specファイルのテーマを記述します。(例で言えば○○アプリ)
内側のdescribe
細かい機能を記述します。
タグとは?
いくつかあるテストのうち特定のテストコードのみタグ付けして実行することができる機能です。
タグの書き方
タグ名にはfocusというタグ名がよく使われます。
1 2 3 4 |
it "仕様",タグ名: true do #仕様 end |
なお、タグはitだけでなく「describeブロック」や「contextブロック」にも付けることは可能です。その場合はブロック内の全テストにそのタグが適用されます。
実行方法
特定のタグを実行する
1 |
rspec --tag タグ名 |
特定のタグをスキップする
タグ名の最初にチルダを付けるとそのタグの実行だけを逆にスキップすることが可能です。
1 |
rspec --tag ~タグ名 |
この記事へのコメントはありません。