indilog

Ruby/Rails/React/Goなどに関して自分が勉強したことなどを投稿しています

RSpecのexpectとis_expectedの挙動の違いについて

subject(:actual_object) { ... }

it { is_expected.to eq(expected_object) }

subject(:actual_object) { ... }

it { expect(actual_object).to eq(expected_object) }

では挙動が異なるという話

上の方を actual_objectexpected_object を同じ属性などを定義した状態で比較しようとすると、

Compared using equal?, which compares object identity, but expected and actual are not the same object. Use expect(actual).to eq(expected) if you don't care about object identity in this example

という注意書きが表示され、上の方法は同じオブジェクトかどうかをobjectのIDで判定していることがわかる

一方で下の方は属性の一致で比較をするため、別オブジェクトであっても、属性さえ一致していればテストが通ることになる

つまり、同じオブジェクトかどうかを比較したい場合は上の方法、同じ属性を持っているかどうかを比較したい場合は下の方の方法を使えば良さそうだ