2010-12-01 20 views
31

estoy escribiendo algunas pruebas RSpec para mi aplicación Rails 3 y tratando de pasar de Webrat a Capybara. Hasta ahora todo bien, pero la aplicación utiliza autenticación básica HTTP para autorizar a mi usuario administrador, ¿alguna idea de cómo puedo probar eso con Capybara?HTTP de autenticación básica para Carpincho

Aquí está mi actual etapa 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 

¿Cómo se hace esto con Carpincho? ¡Gracias!

Respuesta

39

lo tengo para trabajar utilizando page.driver.basic_authorize(name, password) lugar

actualización:

Por el momento, después de una actualización de Carpincho, estoy usando este montón de soluciones:

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 
+1

fresca, esto funciona! Para referencia futura: Encontré un comentario de Jonas Nicklas, el creador de Capybara, que aconseja no utilizar el controlador, ya que no todos los controladores de Capybara admiten encabezados HTTP (https://github.com/jnicklas/capybara/issues/issue/17) ... si alguien lo necesitara En lo que a mí respecta, esta es la solución que necesito. Gracias Anders! – Cimm

+2

'page.driver.browser.basic_authorize' funcionó para mí. ¡¡¡Gracias!!! –

+0

¡Rock! 'page.driver.browser.basic_authorize' funcionó para mí –

1

I tenido que hacer esta horrible truco para conseguir que funcione la pena sin cabeza y con 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:[email protected]#{page.driver.current_url.gsub(/^http\:\/\//, '')}") 
end 
end 
2

Esto ha cambiado en las versiones recientes de pepino-rieles (estoy usando 1.0.2).

pepino-carriles utiliza el conductor Rack/Prueba de forma predeterminada, por lo que si usted no ha cambiado, las siguientes instrucciones funcionará.

Crear características/step_definitions/authorize.rb:

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

Ahora usted puede utilizar esto en sus características:

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

Gracias Joost, pero la pregunta no mencionaba a Cucumber. Fue solo una pregunta sobre Capibaras. Es bueno saber que hay una forma simple en Pepino para hacer esto. – Cimm

+0

Independientemente de si usa RSpec y no Cucumber para ejecutar las características, la respuesta es igualmente válida si ha conservado el controlador predeterminado en Capybara, que es Rack :: Test. –

24

El conductor Carpincho por defecto, porta-prueba, tiene un método basic_authorize (con alias authorize) para autenticación HTTP básica, y digest_authorize para autenticación HTTP implícita, aquí usted puede encontrarlos: https://github.com/brynary/rack-test/blob/master/lib/rack/test.rb

Por lo que puede hacer:

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

O puede escribir un ayudante simple para HTTP básico de autorización:

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

Su primera línea {page.driver.browser.authorize 'login', 'password'} funciona de maravilla, es una pena que no funcione en una antes: cada bloque para una prueba rspec 2, pero funciona bien directamente antes de una llama para visitar. Gracias por la respuesta – jamesc

+2

Merece la pena señalar que este método funciona al agregar el encabezado 'Authorization' a la solicitud, por lo que debe llamar a esto ANTES de' visitar'. –

+0

Gracias @LachlanCotter, estaba pensando en eso. – Calvin

2

Ninguna de las soluciones page.driver.* trabajó para mí. Estoy usando Poltergeist, no Selenium, por lo que podría tener algo que ver con eso. Esto es lo que hizo el trabajo:

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 

Luego, en su especificación:

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

    # Your test code here... 
end 
+0

Esto es fácil y limpio. En lugar de un shared_context, puse el bloque 'config.before (: each) do'. –

0

hombre, ninguna de estas soluciones trabajó para mí. solución

Pistos' estuvo cerca y trabajó para las especificaciones de características con js: true pero falló cuando sin cabeza.

Esta solución de abajo funciona para mí para tanto sin cabeza y js: true especificaciones.

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 

Luego, en su especificación:

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

    # test examples 
end 
Cuestiones relacionadas