ActionController の verify と :xhr => true を指定したときの TestCase

ActionController には verify というクラスメソッドがあります。「request.method は :post か?」とか「params に :id が含まれているか?」といった検査を :only, :except に該当する action の実行前に行ってくれるものです。

update_name という action で POST かつ prototype.jsAjax 呼び出しであることを検査する場合には、次のようにします。

class ArticleController < ActionController::Base
  verify :method => :post, :xhr => true, :only => :update_name

  def update_name
    ...
  end
end

さらに、これに対するテストを書く場合 verify :xhr => true がやっている検査に合うようにヘッダを設定しないと verify に引っかかってしまいます(verify してるのだから)

  @request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'

こういう場合には ActionController::TestProcess#xml_http_request を使えば、ヘッダの設定を行った上で指定の action を実行してくれます。

class ArticleControllerTest < Test::Unit::TestCase
  def test_update_name
    xml_http_request :post, :update_name, { :id => 234, :name => "foobar" }
    # assert を書く
  end
end