Railsでhelperをテストする

Railsの開発でちょっとしたhelperを作った。レコードの日付と現在日付を比較して、一定の期間毎に違うCSSクラス名を返す。各CSSクラスでは背景色だけが違い、それによって視覚化できるというもの。
簡単ではあるんだけど、日付を4つのパターンに分解するので、境界が多い。コードも甘いような気がするので、後々のリファクタリングのために、テストを自動化しておこうと思った。

def get_tr_class( result )
return "tr_past" if result.release_date.blank?
now_term      = 14 # Days
future_border = now_term.days.since.strftime('%Y/%m/%d')
today         = Time.now.strftime('%Y/%m/%d')
past_border   = now_term.days.ago.strftime('%Y/%m/%d')
if result.release_date < past_border
"tr_past"
elsif result.release_date > future_border
"tr_future"
elsif result.release_date <= future_border && result.release_date > today
"tr_soon"
else
"tr_now"
end
end


ところが、Railsってhelperのテストを行う箇所がないのですね。行いたいテストはunitテスト程度の単純なもの。functionalテストでデータを用意し、responseから該当部分を探すという手もあるけど、ちょっと大袈裟すぎ。
色々考えた結果、プリミティブなオブジェクトを作って、それにhelperの機能を追加してみた。

def test_get_tr_class
helper = Object.new.extend(ReleaseHelper)
r = Result.new( :release_date => 15.days.since.strftime('%Y/%m/%d') )
assert_equal "tr_future", helper.get_tr_class( r )
r = Result.new( :release_date => 14.days.since.strftime('%Y/%m/%d') )
assert_equal "tr_soon", helper.get_tr_class( r )
r = Result.new( :release_date =>  1.days.since.strftime('%Y/%m/%d') )
assert_equal "tr_soon", helper.get_tr_class( r )
r = Result.new( :release_date =>  Time.now.strftime('%Y/%m/%d') )
assert_equal "tr_now", helper.get_tr_class( r )
r = Result.new( :release_date =>  1.days.ago.strftime('%Y/%m/%d') )
assert_equal "tr_now", helper.get_tr_class( r )
r = Result.new( :release_date => 14.days.ago.strftime('%Y/%m/%d') )
assert_equal "tr_now", helper.get_tr_class( r )
r = Result.new( :release_date => 15.days.ago.strftime('%Y/%m/%d') )
assert_equal "tr_past", helper.get_tr_class( r )
r = Result.new # release_date is blank
assert_equal "tr_past", helper.get_tr_class( r )
end


テストは機能的にはunitレベルといえ、helper自体がControllerに属するのでfunctionalに追加した。
この方法で正しいのでしょうか?「俺はこうやってるよ」などの意見を伺いたいです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする