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などという名前の共通メソッドとして作っておけば,便利メソッドとして重宝するかも。

Trackback URL:

コメントを残す

コメントを投稿するにはログインしてください。

Get Adobe Flash playerPlugin by wpburn.com wordpress themes