Rails6の学習・RSpecの基礎知識
RSpecの初期設定
$ bin/rails g rspec:install
簡単な例
spec/experiments/string_spec.rb
require "spec_helper"
describe String do
describe "#<<" do
example "文字の追加" do
s = "ABC"
s << "D"
expect(s.size).to eq(4)
end
end
end
- テストコードは spec ディレクトリ配下で、ファイル名の末尾に
_spec.rb
と付ける。 - モデルクラスに関する spec ファイルは
spec/models
に、API に関する spec ファイルは spec/requests ディレクトリに置くのが一般的。
エグザンプル
RSpec は ビヘイビア駆動開発(BBD) というプログラム開発手法を Ruby で実践するために作られたテストフレームワークである。
テスト駆動開発で記述されるテストケースは、作成したプログラムの動作が正しいかどうかを検証するために行う「テスト」である。テストであるという点は同一であるが、加えて、これから作成しようとするプログラムに期待される「振る舞い」や「制約条件」、つまり「要求仕様」に近い形で、自然言語を併記しながらテストコードを記述する。テストフレームワークのメソッド名も自然言語(英語など)に近い形をとっている。
テストコードの可読性があがる上、テストコードが要求仕様となりうる。要求仕様からテストコードを起こす際も、スムーズにコードに移行しやすい。
BDDではスペック(仕様)とテストは限りなく近い物である。従って、テスト駆動開発における「テストファースト」は、BDDにおいては「スペックファースト」となり、スペックを作ってから実装するという、より自然な形でのプログラム製作を実現している。
テストがそのままアプリケーションの仕様書になるように書けるようだ。それをビヘイビア駆動開発と呼ぶらしい。
エグザンプルグループ
describe と end で囲まれたグループがエグザンプルグループ。describe の引数にはクラスまたは文字列を指定する。入れ子も可能。 #<<
の #
はインスタンスメソッドであることを示す慣用的な記号であり、RSpecにとって意味があるわけではない。
pending メソッド
テストが失敗した箇所を一旦保留としたいとき。
example "nilの追加" do
pending("調査中")
s = "ABC"
s << nil
expect(s.size).to eq(4)
end
pending
メソッドを利用する。example を xexample
としても保留される。ただし、pendingメソッドのようにコメントを挟めない。
例外のテスト
ブロックを利用して書くことができる。
example "nilは追加できない" do
s = "ABC"
expect { s << nil }.to raise_error(TypeError)
end
タグによる絞り込み
エグザンプルにタグをつけて、タグごとにテストを走らせることも可能。
example "nilは追加できない", :exception do
s = "ABC"
expect { s << nil }.to raise_error(TypeError)
end
$ rspec spec --tag=exception
Discussion