#matcherとは
期待値と実際の値を比較して一致した又は一致しなかった結果を返すオブジェクト
expect(100 + 200).to eq 300
expect([100, 200, 300]).to include 200
⚫︎eqとinclude
がmatcher
eqは300と同じか、includeは200が含まれているか
⚫︎to ~であること、not_to ~でないこと、toはmatcherではない
よく使うmatcher
・eq
期待値と実際の値が等しいかどうかを検証する時に使う
expect(100 + 200).to eq 300
・be
値の大小を検証する時に使う
expect(100 + 200).to be >= 300
上のコードは100+200が同じであることを検証
・be_xxx (predicateマッチャ)
empty? のように戻り値が true / false になるメソッドを be_empty のような形式で検証できる
expect([]).to be_empty
#下のコードと同じ意味になる
expect([].empty?).to be true
# または
expect([].empty?).to eq true
Railsのmodelにバリデーションエラーが発生していないことを検証する場合には、次のように書ける。
user = User.new(name: 'Taro',account: "taro", email: 'taro@example.com')
expect(user).to be_valid # user.valid? が true になればパスする
・be_truthy と be_falsey
Railsのmodelで save メソッドを呼ぶと、保存に成功した場合は true 、失敗した場合は false が返ってくる
class User < ActiveRecord::Base
validates :name, :email, presence: true
end
class User < ActiveRecord::Base
#必要事項が入力されていないので入力できない(false)
user = User.new
expect(user.save).to be_falsey
# 必須項目が入力されているので保存できる(true)
user.name = 'Taro'
user.account = 'taro'
user.email = 'taro@example.com'
expect(user.save).to be_truthy
「trueっぽい値」または「falseっぽい値」かどうかを検証してくれるのが
be_truthy と be_falsey
です。
be_true と be_false 又は eq true と eq falseを使うと
true もしくはfalseであることを厳密に検証するので、それ以外の値を渡されるとテストが失敗する
・change + from / to /by
# popメソッドを呼ぶと配列の要素が減少することをテストする
x = [100, 200, 300]
expect(x.size).to eq 300
x.pop
expect(x.size).to eq 200
change マッチャを使うと次のように書き換える
x = [100, 200, 300]
expect{ x.pop }.to change{ x.size }.from(300).to(200)
expect{ X }.to change{ Y }.from(A).to(B) = 「X すると Y が A から B に変わることを期待する」。byを使うと1個減ることを検証できる。
x = [1, 2, 3]
expect{ x.pop }.to change{ x.size }.by(-1)
減る場合だけでなく増える場合も検証できる
x = [1, 2, 3]
expect{ x.push(10) }.to change{ x.size }.by(1)
まだたくさんありますがよく使うものだけです。
有益な記事
この記事でCherry本の著者の伊藤さんが仕事でよく使うマッチャーを言及しています。
よかったら読んでください。
自分も不要なマッチャーを使ってしまい、無駄な作業になってしまったことがあったので
おすすめです。