私は 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
ここから取得したブロック:
Capybara + Cucumber + Selenium Driver を使用した Authlogic が機能しない
**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
私のカピバラのテストは以下で問題なく動作しています:
activate_authlogic
UserSession.create FactoryGirl.build(:user)
before(:each) ブロックでは、:js=>true を使用した場合にのみ問題が発生します
だから、私の質問は次のとおりです。
- Rails 3.2.x では、spec_helper の修正 (モジュール Authlogic ... ) が機能しなくなったということですか。
- 実際にそうである場合、これを機能させる「通常の」方法は何ですか?