答えとしては、そもそも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について全くテキトーに扱っていた私にとっては青天の霹靂でした。ちょうど秀逸な記事があったのでリンクを貼っておきます。

RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い http://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c

そもそもDateTimeってナノ秒まで使えないの?

使えません。秒までです。

Ruby DateTime
Rails DateTime

Rubyでは何ならナノ秒まで使えるの?

Timeなら使えます。

Ruby Time
Rails Time

感想

怖い