RSpec自体にあるmatcherの一覧を調べました。 長いので2回に分けています。
be_truthy
if文でtrueと判定される物かどうかを調べます。
nilとfalse以外を通します。
RSpec2まではbe_trueという名前でした。
しかし「be_trueなのにtrue以外(数字や文字列)も通る事がおかしい」という事でこの名前になりました。
be_falsy
be_truthyの逆です。
nilとfalseのみ通ります。
be_nil
nilかどうかを見ます。
a_nil_valueというaliasもあるようです。
be(*args)
これは引数に符号を渡して使うmatcherです。
aliasとしてa_valueというものもあります。
expect(10).to be == 10 expect(10).to be > 9
be_a(klass)
targetがklassのインスタンス or klassの親クラスのインスタンスならテストが通ります。
aliasはbe_anというものがあります。
be_an_instance_of(expected)
be_aと似たメソッドです。
しかしbe_an_instance_ofはbe_aと違ってexpectedがtargetの親クラスだった場合はテストが通りません。
be_a_kind_of(expected)
こちらはbe_aと全く同じ物です (be_aは内部でbe_a_kind_ofを呼び出している)
わざわざメソッドが分かれているのは何か歴史的な経緯があるうのかもしれません。
aliashはbe_instance_ofとan_instance_ofがあります。
be_between(min, max)
対象がminとmaxの間に入っているかを見ます。
対象がminやmaxとイコールの場合もテストが通ります。
aliasはa_value_betweenです。
be_within(delta)
これは下記のように使います。
ofの引数とtargetの差がdelta以内かどうかを調査します。
be_betweenも同じような事ができそうですね。
expect(1.0).to be_within(0.4).of(1.3)
a_value_within、withinというaliasがあります。
change(receiver=nil, message=nil, &block)
changeはブロック中での値の変化を見ます。
from, to を使ってブロック前後での値の変化を見る事でできます。
値がどのくらい変化したかを見る場合はbyが使えます。
変化量の最大値や最小値を指定するby_at_leastやby_at_mostもあります。
a = [] expect {a << 1} .to change(a, :size).from(0).to(1) expect {a << 1} .to change(a, :size).by(1)