Pebble's Diary

プログラマーの作業メモ

rails ログインのintegration testで失敗する原因

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を設定しないのが正しい運用ということになる。