datetime型を持つモデルのテスト
Ruby on Railsにおいて,テスト環境がとっても気持ちがいいと「前のエントリ」で書いたが,実際にテストケースを書き始めると,やっぱり知らないことがいろいろと出てきて,サクサクっとはいかない。もちろん,それは俺がバンビーノだからなのだが。。。
datetime型な列があるappointments表のAppointmentモデルをテストすることを考える。fixtureには,こんな感じで記述するだろう。
さて,Appointmentモデルのテストコードだが,
とすると,「ダメじゃないかなぁ」と記述中に思っていたのが的中し,Failureになってしまった。
1) Failure:
test_create(AppointmentTest) [./test/unit/appointment_test.rb:13]:
<”2007-07-10 13:30:00″> expected but was
<Tue Jul 10 13:30:00 JST 2007>.
ま,これは当然で,期待する値を文字列で,実際の値はTimeインスタンスで,っていう型違いで比較しているので,こういった問題が出てしまう。オオボケといえばそうなんだけど。
文字列として比較をする方向で修正を試みる。Timeクラスには,strftimeメソッドによって,指定した書式により日時を文字列化することができる。よって,ここではモデルから日時オブジェクトを取り出した後に,strftimeメソッドにfixtureで使用した書式を渡して文字列化し,その結果を比較するようにすればうまくいく。
もう一つの方法として,Timeクラスのインスタンスに揃えて比較を行ってみる。Timeクラスのlocalメソッドに年月日時分秒の値をそれぞれ渡せばTimeインスタンスを得ることができるので,期待する値にこれを適用する。
どちらかの方法(個人的には後者が好み)をassert_datetimeなどという名前の共通メソッドとして作っておけば,便利メソッドとして重宝するかも。


