答えとしては、そもそもActiveRecordのt.timestampで生成されたcreated_atは、DateTimeではなくTime型だったということです。
ということで、テストでどう指定しようか困りました。
当座の解決策として、秒以上のみの比較と、ナノ秒の比較を分けることにしました。
expect(@invitation.expire_at.nsec).to eq(999999999)
expect(Time.at(@invitation.expire_at.to_i)).to eq(DateTime.now.change(hour: 23, min: 59, sec: 59))
カッコ悪いので何か他の書き方ないかな(※テストコードは本番コードと別の書き方をしてます)
参考: Ruby の Time でマイクロ秒・秒を切り捨てる
RubyとRails、それぞれのTimeとDateTimeについて全くテキトーに扱っていた私にとっては青天の霹靂でした。ちょうど秀逸な記事があったのでリンクを貼っておきます。
そもそもDateTimeってナノ秒まで使えないの?
使えません。秒までです。
Rubyでは何ならナノ秒まで使えるの?
Timeなら使えます。
感想
怖い