気ままに気ままのエンジニアブログ

定期的に得た知見を気ままに発信中

【Rails/Rspec】expected: 1 got: 0の原因は「日付」の記述方法だった!

こんにちは。

今年も残り1日。今年に悔いはない!来年よお主を待ている。

どうもハチマキです。

はじめに

rspecのテスト記述をしていて、ローカル環境ではテストが通るのに、Travis CIで落ちました。
この原因特定に結構時間をさいたので、誰かのソリューションになれば幸いです。

では早速行きましょう!

本日の概要 : expected: 1 got: 0の原因は「日付」の記述方法だった!

エラー例

#hoge.rb
省略
1.days == Date.today #こいつが原因でした


#hoge_spec.rb
Failures:
  1) test内容 〇〇が送られること
     Failure/Error: expect(ActionMailer::Base.deliveries.size).to eq(1)
       expected: 1
            got: 0
       (compared using ==)
     # ./spec/hoge_spec.rb:41:in `block (4 levels) in <top (required)>'

原因

結論は、「日時の扱い方」でした。
日付の理解が低く、記述方法に誤りがありエラーが発生しました。

具体的には、Date.todayを使用して、データを取得しておりましたが、これが原因で発生したエラーでした。

解決方法

これ「Date.today」をこう「Date.current」です!これで解決に至りました。

#hoge.rb
1.days == Date.today

#これをこうです 

1.days == Date.current 

いつも参考資料にさせていただいてる@jnchitoさんの記事に対象となる読者

  • Railsで Time.now と Time.current の違いがよくわかっていない人

完全に私でした(汗汗

下記の違いを理解していたら簡単に解決できた問題でした。

  • 素のRubyならTimeクラスを使う。
  • RailsならTimeWithZoneクラスを使う。