私の (Rails 3.2) Test::Unit コントローラー/機能テストでは、assert_routing が次のエラーで失敗しています:
1) Error:
test: with an admin user routing should route GET /admin/contracts to/from {:action=>"index", :controller=>"admin/contracts"}. (Admin::ContractsControllerTest):
NoMethodError: undefined method `authenticate!' for nil:NilClass
ルート付き:
authenticate :admin do
namespace :admin do
resources :contracts
end
end
コントローラー テストで Devise 2.0 認証を設定しています。
admin = Factory.create(:admin)
admin.confirm!
@request.env["devise.mapping"] = Devise.mappings[:admin]
sign_in :admin, admin
この回答Stubbing Warden on Controller Testsは、アプリケーションが実行される前でもラックが認証されている可能性があることを示しています。私のコントローラーテストが実行されており、すでに環境変数をセットアップしているはずなので、これは奇妙です。しかし、authenticate が呼び出された時点でrequest.env["warden"]
は nil です。
そのラックは、Devise ヘルパーが環境変数をセットアップする前に実行されていますか? その場合、ルーティング ファイルをラック チェックする前に認証を設定するにはどうすればよいですか? 私の他のアサートはパスしますが、assert_routing は特殊なケースのようです。
編集:
#authenticate を呼び出す前にセットアップが実行されていることを確認し、Devise が実際に request.env['warden'] をWarden::Proxy
オブジェクトで初期化していますが、#authenticate が呼び出されると、`request.env['warden'] は nil です。それは、ラックが別のスレッドまたは何かで実行されていることを意味しますか。とても紛らわしいので、私は何か間違ったことをしていると確信しています。-_-