😎
RSpec の eq nil と be_nil の違い
RSpec でテスト対象が nil
であることをテストするときに
expect(subject).to eq nil
や
expect(subject).to be_nil
みたいに書くことで担保する事ができます。
eq nil
と be_nil
の違い
上記の2つの書き方は担保する事自体は同じなんですが内部で実行されているコードとしては少し意味が異なります。
expect(subject).to eq nil
は内部では subject == nil # => true
であること担保しています。
# これと等価
expect(subject == nil).to eq true
一方で
expect(subject).to be_nil
の場合は subject.nil? # =>< true
であることを担保しています。
# これと等価
expect(subject.nil?).to eq true
なので『 nil
であることを担保する』ことには変わらないんですが担保する手段がちょっと違う、って感じにはなりますね。
個人的には be_nil
が RSpec らしさがあって好みではある。
be_xxx
について
上記で書いた be_nil
マッチャなんですが、実際には be_nil
マッチャというものは存在しておらずに
expect(subject).to be_xxx
は内部では
expect(subject.xxx?).to eq true
としてテストが実行されます。
なので ActiveSupport の present?
や blank?
が真であることを担保したい場合は expect(subject).to be_present
や expect(subject).to be_blank
みたいな書き方できます。
これを知っているといろいろと応用ができますね。
Discussion