ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

RSpecでテスト手習いその2

昨日はTDD(Test Driven Development)とか銘打っておきながらちっともDevelopmentしてなかったのですが、今日もやりません。
ぶっちゃけ内容を考えるとタイトルは今日みたいな感じのほうが妥当だったかもしれませんね。

さて、昨日は文章量の割に結構あっさりとやってみたので、Rubyist Magazine - スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)のもう少し下の方と、昨日頂いたコメントを見てみます。

まずはコメントから

id:sora_h

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というのを指定してやる、というのが基本の流れです。
マッチャというのは特に難しいものではなくて、比較演算子や、期待した値を示すもののことです。例えばこんなのことか。

RSpec では、次の演算子をマッチャとして利用できます。

  • <
  • <=
  • ==
  • ===
  • =~
  • >
  • >=

なお否定演算子はありません。shouldとshould_notというメソッドがあるのでいい感じにやりましょう。

「be_なんとか」というのについて

これもマッチャのひとつです。コンテキストの#なんとか?というメソッドに対応するらしいですね。たとえばbe_emptyなら#empty?、be_zeroなら#zero?を呼び出すという要領です。「it should be なんとか」といった感じに、なるべくコードが自然な英文になるように設計されているみたいですね。
似たような感じで「have_なんとか」というマッチャも指定できます。こちらは#has_なんとか?というメソッドに対応するようです。
他にも組み込みのマッチャを使ったり、独自のマッチャを作ってしまえたりします。おいおい覚えていきましょう。

今日はここまで!

*1:Matcher。当然変換しようとすると最初に「抹茶」と出てきました