2

私の (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 です。それは、ラックが別のスレッドまたは何かで実行されていることを意味しますか。とても紛らわしいので、私は何か間違ったことをしていると確信しています。-_-

4

1 に答える 1

1

コントローラー (機能) テストは、コントローラー レベルのままであり、下位レベルの環境状態にはアクセスできません。そのrequest.env['warden']ため、コントローラ レベルのテストに合格できるように Devise::TestHelper でモックされますが、Rack を実行すると request.env ハッシュが nil になり、ルートが上記のエラーで失敗します。

これは、routes.rb での認証の長所と短所です。コントローラー レベルでの認証について心配する必要はありませんが、コントローラー レベルでルートをテストすることもできません。これはRailsの制限であるため、少なくとも現時点(Rails 3.2)ではそうではありません。

クローズ済みの問題を参照してください https://github.com/plataformatec/devise/issues/1670

于 2012-03-14T13:43:46.530 に答える