controllerのテストの書き方

controllerのテストから他のcontrollerを呼び出すには?

scaffoldが吐き出したテストの雛形からcontrollerを呼び出す際には以下のように記述します。*1

  post :login, :login => { :user => 'pastaonly', :password => 'password' }

第一引数がaction名、そして第二引数のハッシュがparametersになります。

上記記述にはcontrollerの指定がありません。また、postにはcontrollerを指定することはできません。
実はcontrollerの指定はまったく別の場所で行なわれているのです。
scaffoldが自動生成したコードを眺めると、その冒頭に以下のような記述があります。

  def setup
    @controller = UsersController.new
    @request    = ActionController::TestRequest.new
    @response   = ActionController::TestResponse.new
  end

怪しい、@controllerが非常に怪しい。そして、やはり怪しい奴が犯人でした。

postメソッドで呼ばれるcontrollerはこのインスタンス変数が指定しています。

ですので、とあるテストの中から他のcontrollerが呼びたいなと思ったときは

  def test_logout
    @controller = PublicController.new
    post :login
    @controller = UsersController.new
    post :logout
  end

のような記述をすればOKです。

*1:HTTP Request Methodの[get,post,put,delete,head]の5つ内、postを例に記述します