😎

RSpec の eq nil と be_nil の違い

2024/04/10に公開

RSpec でテスト対象が nil であることをテストするときに

expect(subject).to eq nil

expect(subject).to be_nil

みたいに書くことで担保する事ができます。

eq nilbe_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_presentexpect(subject).to be_blank みたいな書き方できます。
これを知っているといろいろと応用ができますね。

GitHubで編集を提案

Discussion