RSpec ちょこっと触ったメモ

Rubyist Magazine - スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編) を参考にしつつ RSpec を使ってみた。テストとか言ってるとプロっぽい。

Behaviour

Behaviour は example という論理的なまとまりを指し、describe メソッドの呼び出しで記述される。

describe TestClass, "case" do

で記述する。「TestClass が "case" のときに」という解釈ができる。

before/after

example の前処理、後処理。example が実行するたびに呼ばれる。Behaviour 単位で前処理、後処理がしたい場合は、それぞれの引数に :all を渡す。

example

プログラムに期待する動作を記述する。

it "should ..." do ... end

it の指しているものは describe メソッドに引数部分で、「TestClass が "case" のときに "should ..."」という解釈になる。日本語と混ざると少し違和感があります。

expectation

期待する動作を記述する。

Object#should
Object#should_not

それぞれの引数には matcher と呼ばれる条件を渡し、should はその条件を満たす期待、should_not はその条件を満たさない期待をする。

よく使いそうな matcher とその例

演算子
(1+1).should == 2
10.should < 11
"apple".should =~ /orange/
have(expected_number).items

要素数の比較

[1,2,3].should have(3).items
[1,2,3].should have_at_least(2).items # actual.items >= number
include(expected)

String か Array のとき actual.includ?(expected) を期待する。

[1,2,3].should include(3)
satisfy{}

引数の Proc を満たすことを期待する。

(2+3).should satisfy {|n| n > 4}
be_XXX

actual.XXX? を期待する。

[].should be_empty

be_true, be_false は true? や false? メソッドを持っていなくても使用できる。

have_XXX

has_XXX? を期待する。英語として自然な記述をするための措置。

pending("reason")

テストや実装を何らかの理由で保留している時に使い、ブロックが無い場合は pending 以下を評価しない。一部だけを評価の対象から外したい場合はブロックを使う。

pending に与えたブロック内の評価で例外が発生「しない」場合、Spec::Expectations::ExpectationNotMetError の例外が発生する。
pending は「実行に失敗しても、今はそれでも良しとすること」を期待しているので、例外が発生しないときに expectationNotMetError が発生する。