Вопрос

Я пишу несколько тестов RSPEC для моих рельсов 3 приложения и пытаясь перейти от Мыс к Водосвинка. Отказ До сих пор так хорошо, но приложение использует HTTP Basic Auth, чтобы авторизовать пользователя своего администратора, любой идеи, как я могу проверить, что с 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

Как мне это сделать с Capybara? Спасибо!

Это было полезно?

Решение

Я получил его на работу, используя 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

Другие советы

Водитель по умолчанию Capybara, Stack-Test, имеет basic_authorize Метод (с псевдонимами authorize) для базового http auth, а также digest_authorize Для Digest HTTP Auth, здесь вы можете найти их: https://github.com/brynary/rack-test/blob/master/lib/rack/test.rb.

Так что вы можете сделать:

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

Или вы можете написать простой помощник для базового http auth:

def basic_auth(user, password)
  encoded_login = ["#{user}:#{password}"].pack("m*")
  page.driver.header 'Authorization', "Basic #{encoded_login}"
end

Ни один из page.driver.* Решения работали для меня. Я использую Poltergeist, а не Selenium, так что может иметь с этим что-то делать. Вот что сделала работу:

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

Это изменилось в последние версии огурценсов (я использую 1.0.2).

Огурец-рельсы используют драйвер стойки / теста по умолчанию, поэтому, если вы не изменили это, будут работать следующие инструкции.

Создание функций / step_definitions / aurize.rb:

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

Теперь вы можете использовать это в своих функциях:

Given I am logged in as "admin" with "password"

Я должен был сделать этот ужасный взлом, чтобы заставить его работать без головы и с 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

Человек, ни один из этих решений не работал для меня.

Решение Pistos 'приблизилось и работало на характеристиках спецификации с js: true но не удалось, когда без головы.

Это ниже решение работает для меня для оба без головы и js: true спецификация

Спецификация / поддержка / когда_authentication.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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top