与Capybara + Cucumber + Selenium驱动程序的Authlogic无法正常工作

kib*_*iba 3 ruby selenium cucumber authlogic capybara

这是我用@javascript和authlogic运行黄瓜测试时得到的错误:

You must activate the Authlogic::Session::Base.controller with a controller object before creating objects
Run Code Online (Sandbox Code Playgroud)

这是我在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
Run Code Online (Sandbox Code Playgroud)

这就是我创建会话的方式:

def create_session 
  Session.create(:name => "test", :password => "test-33")
end
Run Code Online (Sandbox Code Playgroud)

没有@javascript,它不会给我关于authlogic没有被激活的错误,但是使用@javascript它会.我该如何解决这个问题?

Act*_*thy 7

Selenium和capybara-webkit在启动进程时使用单独的线程.运行activate_authlogic时,它会执行以下操作

Authlogic::Session::Base.controller = (@request && Authlogic::TestCase::RailsRequestAdapter.new(@request)) || controller
Run Code Online (Sandbox Code Playgroud)

最终设置了一个线程局部变量:authlogic_controller.问题是,当您在使用@javascript标记的方案中开始使用新线程时,这会丢失.

对我来说,修复是像monkeypatch 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
Run Code Online (Sandbox Code Playgroud)

这复制了acivate_authlogic中的操作.确保只修补测试环境.