3

これは、authlogic で @javascript を使用してキュウリ テストを実行したときに発生するエラーです。

You must activate the Authlogic::Session::Base.controller with a controller object before creating objects

これは、feature/support/authlogic.rb にある私の authlogic サポート コードです。

require "authlogic"
require "authlogic/test_case"
World(Authlogic::TestCase)

ApplicationController.skip_before_filter :activate_authlogic

Before do
  activate_authlogic
end

これは私がセッションを作成した方法です:

def create_session 
  Session.create(:name => "test", :password => "test-33")
end

@javascript がないと、authlogic がアクティブ化されていないというエラーは表示されませんが、@javascript を使用するとエラーが発生します。この問題を解決するにはどうすればよいですか?

4

1 に答える 1

7

Selenium と capybara-webkit は、プロセスの起動時に別のスレッドを使用します。activate_authlogic を実行すると、次のことが行われます

Authlogic::Session::Base.controller = (@request && Authlogic::TestCase::RailsRequestAdapter.new(@request)) || controller

これにより、:authlogic_controller のスレッド ローカル変数が設定されます。問題は、@javascript でタグ付けされたシナリオで新しいスレッドを使用し始めると、これが失われることです。

私にとって、修正はそのようなauthlogicコードをモンキーパッチすることでした

module Authlogic
  module Session
    module Activation
      module ClassMethods
        def controller
          if !Thread.current[:authlogic_controller]
            Thread.current[:authlogic_controller] = Authlogic::TestCase::MockController.new
          end
          Thread.current[:authlogic_controller]
        end
      end
    end
  end
end

これは、acivate_authlogic で行われることを複製します。テスト環境にのみパッチを適用するようにしてください。

于 2012-09-11T21:26:58.997 に答える