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を例に記述します