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_object
と expected_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で判定していることがわかる
一方で下の方は属性の一致で比較をするため、別オブジェクトであっても、属性さえ一致していればテストが通ることになる
つまり、同じオブジェクトかどうかを比較したい場合は上の方法、同じ属性を持っているかどうかを比較したい場合は下の方の方法を使えば良さそうだ