在rails 3.2.12升级后,Authlogic / Selenium中断

时间:2013-04-22 14:39:35

标签: selenium ruby-on-rails-3.2 authlogic rspec-rails

我正在使用Authlogic,并且在升级到Rails 3.2.12之后很难让我的Selenium测试与:js => true 一起使用。相同的测试用于在Rails 3.1.3下工作。我正在使用Spork运行我的测试。

我通过Selenium登录启动Firefox(19.0.2),填写登录表单,但后来我收到来自Authlogic的权限错误,标准“您不能访问此操作。”

我可以看到很多人都遇到了这个问题,但正如我所提到的,一旦从Rails 3.1.3升级到Rails 3.2.12,我只会成为一个问题。我怀疑这个问题可能在我的spec_helper文件中(下面),特别是在

  

模块Authlogic

阻止我从这里获得:

Authlogic with Capybara + Cucumber + Selenium Driver not working

**spec_helper.rb**

require 'rubygems'
require 'spork'
require 'authlogic/test_case' 

include Authlogic::TestCase

Spork.prefork do
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)

  require 'rspec/rails'

  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|

    config.color_enabled = true

    ApplicationController.skip_before_filter :activate_authlogic
    config.before(:each, :type => :request) do
      activate_authlogic
    end

    config.include FactoryGirl::Syntax::Methods

    config.include Capybara::DSL

    config.use_transactional_fixtures = false

    config.before(:suite) do
      DatabaseCleaner.clean_with(:truncation)
    end

    config.before(:each) do
      DatabaseCleaner.strategy = :transaction
    end

    config.before(:each, :js => true) do
      Capybara.current_driver = :selenium

      DatabaseCleaner.strategy = :truncation

      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
    end

    config.before(:each) do
      DatabaseCleaner.start
    end

    config.after(:each) do
      DatabaseCleaner.clean
    end

    config.include(MailerMacros)
    config.before(:each) { reset_email }

    config.mock_with :mocha

    config.infer_base_class_for_anonymous_controllers = false

    config.order = "random"

    config.treat_symbols_as_metadata_keys_with_true_values = true
    config.filter_run :focus => true
    config.run_all_when_everything_filtered = true
  end
end

Spork.each_run do
  FactoryGirl.reload
end

我的理解是Authlogic和Selenium Webdriver在不同的线程上工作,因此需要在spec_helper文件中使用此补丁。

在Request Spec中,我从Authlogic收到权限错误。以下是有问题的Request Spec测试:

# UNIT REQUEST SPEC
require 'spec_helper'

describe "Units" do

  describe "GET /admin/units/new" do
    before(:each) do
      activate_authlogic
      UserSession.create FactoryGirl.create(:admin_user, :email => "foo@bar.com", :password => "password", :password_confirmation => "password")      

      visit root_path
      fill_in "user_session[email]", :with => "foo@bar.com"
      fill_in "user_session[password]", :with => "password" 
      click_button "Sign In"    
    end

    it "displays a pop up dialog after unit is created", :focus, :js => true do
      visit new_admin_unit_path
      fill_in "Title", :with => "Unit Title"
      fill_in "Code", :with => "U-TEST"
      fill_in "Learning Outcome", :with => "Some Learning Outcome"
      fill_in "unit[learning_outcomes_attributes][0][assessment_methods_attributes][0][content]", :with => "Some Assessment Criteria"

      click_button "Save and Publish"      
      page.should have_css('div.ui-dialog')
    end
  end
end

我的Capybara测试工作正常:

activate_authlogic
UserSession.create FactoryGirl.build(:user)

在before(:each)块中,问题仅在使用时出现:js => true

所以,我的问题是:

  • 使用Rails 3.2.x的情况是spec_helper修复(模块Authlogic ...)不再有效。
  • 如果事实确实如此,那么让这种方式发挥作用的“正常”方式是什么?

1 个答案:

答案 0 :(得分:2)

今天刚刚重访。当我升级Rails时,我还将capybara升级到最新版本(2.1.0)。似乎将从这个版本(2.1.0)降级到版本2.0.1的水豚似乎成功了。我可以看到capybara(2.0.1)使用xpath(1.0.0),而capybara(2.1.0)使用xpath(2.0.0)以及不同版本的nokogiri gem。我不知道那里是否有链接,但如果有人关心的话,这里是我的宝石文件:

source 'http://rubygems.org'

gem 'rails', '3.2.12'

gem 'rack-mini-profiler'        
gem 'authlogic'                 
gem 'rails3-generators'   
gem 'mysql2'  
gem 'declarative_authorization' 
gem 'kaminari'                  
gem "foreigner"                
gem 'validates_timeliness'     
gem "activerecord-import", ">= 0.2.0"
gem 'ezcrypto'                 
gem 'thin'                       
gem 'exception_notification'    
gem 'mail'
gem 'libv8', '~> 3.11.8.0'
gem "therubyracer", :require => 'v8'
gem 'jasmine', :group => [:development, :test]  
gem 'sprockets'
gem 'jquery-rails'
gem 'tinymce-rails'             
gem 'acts_as_list'              
gem 'cocaine'
gem 'rmagick'                   
gem 'carrierwave'               
gem 'remotipart'                
gem 'deep_cloneable', '~> 1.4.0'
gem 'delayed_job_active_record' 
gem 'daemons'
gem 'rb-readline'
gem "jquery-migrate-rails", "~> 1.0.0"
gem 'ransack'
# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails', "~> 3.2.3"
  gem 'coffee-rails', "~> 3.2.1"
  gem 'uglifier', '>= 1.0.3'
end

# Bundle gems for the local environment. Make sure to
# put test-only gems in this group so their generators
# and rake tasks are available in development mode:
group :development, :test do
  gem 'cheat'                   
  gem 'ruby-growl'
  gem 'letter_opener'           
  gem 'rspec-rails', "~> 2.0"
  gem 'database_cleaner'        
  gem 'rb-fsevent', '~> 0.9.1'
  gem 'guard-rspec'
  gem 'spork-rails'
  gem 'guard-spork'
  gem 'factory_girl_rails'
  gem 'capybara', '2.0.1'
  gem 'launchy'
  gem 'mocha', :require => false
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'meta_request'
end