しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

RSpec(rspec-rails 以外)のmatcher一覧 その1

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)