这是我用@javascript和authlogic运行黄瓜测试时得到的错误:
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它会。我该如何解决这个问题?
答案 0 :(得分:7)
Selenium和capybara-webkit在启动进程时使用单独的线程。当您运行activate_authlogic时,它会执行以下操作
Authlogic::Session::Base.controller = (@request && Authlogic::TestCase::RailsRequestAdapter.new(@request)) || controller
最终设置了一个线程局部变量: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
这复制了acivate_authlogic中的操作。确保只修补测试环境。