RSpecでテスト手習いその2
昨日はTDD(Test Driven Development)とか銘打っておきながらちっともDevelopmentしてなかったのですが、今日もやりません。
ぶっちゃけ内容を考えるとタイトルは今日みたいな感じのほうが妥当だったかもしれませんね。
さて、昨日は文章量の割に結構あっさりとやってみたので、Rubyist Magazine - スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)のもう少し下の方と、昨日頂いたコメントを見てみます。
まずはコメントから
describe Array context "when empty" do subject { [] } it { should be_empty } its(:size) { should be_zero } end end
インデントは私が入れました。たぶんはてブロの仕様で行頭の空白消えちゃったんでしょうね…
今でこそ「ああこれはこれを可能な限り簡潔に書いたやつだな」と、 最近話題のRSpecのプレゼンの中で知らなかったこと - アントレストラクチャー 滝沢のブログとかRSpecとかを見たのでわかりますが、最初見たときは簡潔すぎて謎でした。コードを書く量の少なさはTest::Unitとくらべてみると一目瞭然です。Unit::Testを書いたことはないけどね!
キーワードいくつか
昨日の続きから読み進めます。少し込み入った話になりますが、いくつかキーワードが出てきます。
- 振る舞い(Behaviour)
- 実行可能なサンプル(Example)
- エクスペクテーション(Expectation)
では頭から見ていきます。
振る舞い
「あるコンテキストに対する実行可能なサンプルを集めたもの」だそうです。コンテキストは、昨日書いたテストコードで言うとArrayクラスのことですね。要はdescribeメソッドの第1引数ということでいいようです。
実行可能なサンプル
上の説明のとおりだと、Example∈Behaviourということです。無駄に数学記号使ってみたかっただけです昨日のコードでいう、
it "should be empty" do @empty_array.should be_empty end
これのことです。このit "should〜" do から始まるブロックの中にエクスペクテーションを書きます。
エクスペクテーション
引用すると、
エクスペクテーションとは「プログラムに期待する動作や動作結果」のことです。
だそうです。具体的に何を書けばいいのかというと、振る舞いを定義するオブジェクトに対するメソッド呼び出しをつらつらと、とのこと。要は昨日のコードでいう
@empty_array.should be_empty
これとか、そらはさんのコメントでいう
should be_empty
これとかですね。RSpecはObjectクラスにshouldとshould_notというメソッドを追加しています。で、このメソッドにマッチャ*1というのを指定してやる、というのが基本の流れです。
マッチャというのは特に難しいものではなくて、比較演算子や、期待した値を示すもののことです。例えばこんなのことか。
- <
- <=
- ==
- ===
- =~
- >
- >=
なお否定演算子はありません。shouldとshould_notというメソッドがあるのでいい感じにやりましょう。
「be_なんとか」というのについて
これもマッチャのひとつです。コンテキストの#なんとか?というメソッドに対応するらしいですね。たとえばbe_emptyなら#empty?、be_zeroなら#zero?を呼び出すという要領です。「it should be なんとか」といった感じに、なるべくコードが自然な英文になるように設計されているみたいですね。
似たような感じで「have_なんとか」というマッチャも指定できます。こちらは#has_なんとか?というメソッドに対応するようです。
他にも組み込みのマッチャを使ったり、独自のマッチャを作ってしまえたりします。おいおい覚えていきましょう。
今日はここまで!
*1:Matcher。当然変換しようとすると最初に「抹茶」と出てきました