railsでログインのintegration testでCSRFエラーが出て、テストに失敗する。
ブラウザから実行した時はエラーにはならない。
延々、原因が分からず、かなり遠回りした結果、原因が判明した。
1) .bash_profileにRAILS_ENV=developを設定していると、rake testした時にdevelop環境でテストが走ってしまう。
2) integration testのケースとブラウザでのケースでのPOST時のパラメーターを比較すると、
integration testの場合は、"utf8","authenticaity_token","commit"パラメーターが渡されていない。
3) develop環境では、CSRFチェックが動作しているので、ActionController::InvalidAuthenticityToken 例外が発生する。
4) test環境では、CSRFチェックを行わないような設定がされている。
config/environments/test.rb
# Disable request forgery protection in test environment. config.action_controller.allow_forgery_protection = false
5) rake testを実行した時に読み込まれるtest/test_helper.rbの先頭には
ENV['RAILS_ENV'] ||= 'test'
のコードがあり、RAILS_ENVが空の場合'test'が設定されるようになっている。 なおテストスクリプトの先頭でrequire 'test_helper'のように呼び出される。
6) まとめると、開発環境 兼 テスト環境のマシンでは環境変数RAILS_ENVを設定しないのが正しい運用ということになる。