ユニットテストから link_to や url_for を使う方法

リンクや URL の HTML を生成してくれるヘルパメソッド link_to や url_for をユニットテストで使いたいことがあるかもしれない。これらは基本的にコントローラかビューのコンテキストで使うことが前提になっているから、ユニットテストではそのままでは使えない。次のような工夫が必要になる。

1. ユニットテストの先頭でヘルパメソッドの格納されているモジュールをインクルード

たとえば EntryTest というユニットテストで、link_to や url_for が使いたいとする。
url_for は ActionController::UrlWriter, link_to は ActionController::UrlWriter にあるから、

class EntryTest < Test::Unit::TestCase
  fixtures :entries
  include ActionController::UrlWriter
  include ActionView::Helpers::UrlHelper
  ...
end

とする。

2. テストで default_url_options を指定

link_to と url_for はホスト名を必要とする。

ActionController::UrlWriter.default_url_options[:host] = "foobar"

のように指定する。default_url_options は省略されたパラメータを補うためにも使用できる。たとえば、entries_helper.rb で、次のようなメソッドがあるとしよう。

def link_to_new
  link_to "新規作成", :action => 'new'
end

これは entry がらみのコントローラやビューから呼び出されるので、暗黙的に :controller => 'entries' である。しかしテストを行うときには、このようなコンテキスト情報は使用できない。そのときは、テスト側では、default_url_options を使って、

def test_link_to_new
  ActionController::UrlWriter.default_url_options[:host] = "foobar"
  ActionController::UrlWriter.default_url_options[:controller] = "entries"
  assert_equal "http://foobar/entries/new", link_to_new
end

というふうに書くことができる。