34

Rails 3アプリケーション用にいくつかのRSpecテストを作成していて、WebratからCapybaraに切り替えようとしています。これまでのところ良好ですが、アプリケーションはHTTP基本認証を使用して管理者ユーザーを承認しています。Capybaraでそれをテストする方法はありますか?

これが私の現在のWebratステップです:

it 'should authenticate for admin' do
  basic_auth('user', 'secret')
  visit '/admin'
  response.status.should eql 200
  response.status.should_not eql 401
end

カピバラでこれを行うにはどうすればよいですか?ありがとう!

4

6 に答える 6

44

page.driver.basic_authorize(name, password)代わりに使用して動作させました

更新

現時点では、Capybaraのアップグレード後、次の回避策の山を使用しています。

if page.driver.respond_to?(:basic_auth)
  page.driver.basic_auth(name, password)
elsif page.driver.respond_to?(:basic_authorize)
  page.driver.basic_authorize(name, password)
elsif page.driver.respond_to?(:browser) && page.driver.browser.respond_to?(:basic_authorize)
  page.driver.browser.basic_authorize(name, password)
else
  raise "I don't know how to log in!"
end
于 2010-12-03T12:53:41.520 に答える
29

デフォルトのCapybaraドライバーであるrack-testには、基本HTTP認証用のbasic_authorizeメソッド(エイリアス付き)があり、ダイジェストHTTP認証用のメソッドがあります:https ://github.com/brynary/rack-test/blob/master /lib/rack/test.rbauthorizedigest_authorize

だからあなたはすることができます:

page.driver.browser.authorize 'login', 'password'

または、基本HTTP認証用の簡単なヘルパーを作成できます。

def basic_auth(user, password)
  encoded_login = ["#{user}:#{password}"].pack("m*")
  page.driver.header 'Authorization', "Basic #{encoded_login}"
end
于 2011-10-29T12:36:12.463 に答える
7

どのpage.driver.*解決策も私にはうまくいきませんでした。私はセレンではなくポルターガイストを使用しているので、それはそれと関係があるかもしれません。うまくいったことは次のとおりです。

RSpec.shared_context "When authenticated" do
  before do
    username = 'yourusername'
    password = 'yourpassword'
    visit "http://#{username}:#{password}@#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}/"
  end
end

次に、あなたのスペックでは:

feature "Your feature", js: true do
  include_context "When authenticated"

  # Your test code here...
end
于 2015-04-17T15:18:39.930 に答える
2

これは、最近のバージョンのキュウリレールで変更されました(私は1.0.2を使用しています)。

cucumber-railsはデフォルトでRack/Testドライバーを使用するため、これを変更していない場合は、次の手順が機能します。

features / step_definitions / authorize.rbを作成します:

Given /^I am logged in as "([^\"]*)" with "([^\"]*)"$/ do |username, password|
  authorize username, password
end

これで、これを機能で使用できます。

Given I am logged in as "admin" with "password"
于 2011-08-02T09:36:14.053 に答える
1

ヘッドレスでjavascriptを使用して動作させるには、この恐ろしいハックを実行する必要がありました

Given /^I am logged in$/ do
 if page.driver.respond_to?(:basic_authorize)
   page.driver.basic_authorize('admin', 'password')
 else
   # FIXME for this to work you need to add pref("network.http.phishy-userpass-length", 255); to /Applications/Firefox.app/Contents/MacOS/defaults/pref/firefox.js
   page.driver.visit('/')
   page.driver.visit("http://admin:password@#{page.driver.current_url.gsub(/^http\:\/\//, '')}")
 end
end
于 2010-12-13T12:42:42.773 に答える
0

男、これらの解決策のどれも私のために働いていませんでした。

Pistosのソリューションは近づき、機能仕様で機能しましjs: trueたが、ヘッドレスの場合は失敗しました。

この以下の解決策は、ヘッドレスとスペックの両方で機能します。js: true

spec / support / when_authenticated.rb

RSpec.shared_context 'When authenticated' do
  background do
    authenticate
  end

  def authenticate
    if page.driver.browser.respond_to?(:authorize)
      # When headless
      page.driver.browser.authorize(username, password)
    else
      # When javascript test
      visit "http://#{username}:#{password}@#{host}:#{port}/"     
     end
  end

  def username
    # Your value here. Replace with string or config location
    Rails.application.secrets.http_auth_username
  end

  def password
    # Your value here. Replace with string or config location
    Rails.application.secrets.http_auth_password
  end

  def host
    Capybara.current_session.server.host
  end

  def port
    Capybara.current_session.server.port
  end
end

次に、あなたのスペックでは:

feature 'User does something' do
  include_context 'When authenticated'

  # test examples
end
于 2015-09-08T23:12:57.167 に答える