別のコントローラを使ったテスト

functionalテストを書こうとしてはまったのでメモしておきます。

ログイン管理を別のコントローラに任せていた場合、普通のHogeControllerTest内でpost()すると、HogeControllerの指定したアクションにPOSTしてくれます。それは嬉しいんですが、HogeController内の認証が必要なアクションのテストをしたい場合は困ってしまうわけです。

実例

  • ログイン処理はLoginControllerで行っている。
  • 家計簿のメイン部分となる HousekeepingControllerはほとんどのアクションでログインが必要。
  • rails本の通り、ApplicationControllerTest#loginを定義して、それを実行するようにしてもサブクラスのコントローラ(ここではHousekeepingController)にPOSTしてしまう。たぶんGETも。

対処

  • ApplicationControllerTestのインスタンス変数@controllerの中身によって、POST/GET先が決まっているようだ。
  • 以下の(汚い)コードを使うと一応うまくいく。
  User.salt = 'your_salt_word'    # <- logingeneratorを使っている場合。
  def login(username = 'you', pass = 'your_pass')
  	orig_controller = @controller
	@controller = LoginController.new

	some_transactions_and_tests()

	@controller = orig_controller
  end

User.salt=に気付かなくてちょっとはまりましたので、そちらもご注意を。でもそれはいらないように思うんですけど。
もっとうまい方法があればどなたか教えてくださると嬉しいです。