关于 ruby?? on rails:authlogic 在使用 selenium 驱动程序时无法与 capybara 一起使用

authlogic not working with capybara when using the selenium driver

我的所有 capybara 测试都使用默认驱动程序与我的 authlogic 成员区域一起工作,但是当我将一个测试更改为使用 selenium 驱动程序时,因为它有 ajax,它给出了我的 theis 错误:

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

事情正在使用 authlogic 的默认驱动程序,所以必须与 selenium 有关??

我在我的 spec_helper 和

中包含了 Authlogic::TestCase

1
2
activate_authlogic
    domain.user_sessions.create(user)

在每个之前。

有人帮我解决这个问题吗?

谢谢瑞克


我这里贴了一个Cucumber 解决方案:通过authlogic登录而不必每次都填写表单

对于 RSpec 集成测试,它是类似的。

在你的 spec_helper.rb:

1
2
3
4
5
6
7
8
9
10
11
require"authlogic/test_case"
RSpec.configure do |config|
  ...
  config.include Authlogic::TestCase
  ApplicationController.skip_before_filter :activate_authlogic
  config.before(:each, :type => :request) do
    activate_authlogic
    UserSession.create(User.find_by_email!(email))
  end
  ...
end

显然,如果您的站点未仅登录,则您可能希望将 config.before 中的两行移动到特定测试中的 before 块中以用于登录规范。如果您保持原样,您可以使用 UserSession.find.destroy 删除会话,或者显然遵循注销链接(如果这在您的规范中更有意义)。


我认为下面的代码可以激活 authlogic:

1
Authlogic::Session::Base.controller = Authlogic::ControllerAdapters::RailsAdapter.new(self)

话虽如此,我更喜欢定义一个实际进入登录表单、填写并登录的步骤。它比较慢,但我很少手动运行整个集成测试套件,通常是持续集成服务器会处理的。


这对我有用(Rails 3.2.1):

在 spec_helper.rb

1
2
require 'authlogic/test_case'
include Authlogic::TestCase

在我的控制器规格中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 def valid_session                                                                                                                                                                  
    activate_authlogic # run before tests are executed                                                                                                                              
    user = Factory(:user)                                                                                                                                                            
    UserSession.create(user, true) #create an authlogic session                                                                                                                      
    @user = @controller.current_user                                                                                                                                                
    {}                                                                                                                                                                              
  end      
  # exemple of valid_session utilization in your test:
  #    valid_session
  #    user_id = @user.id
  #    
  #    or
  #
  #    get :index, {}, valid_session

享受吧!