2010-09-22 20 views
58

Aquí mi http autenticación básica en el archivo de controlador de aplicación (application_controller.rb)rieles/Rspec realizar pruebas pasan por http autenticación básica

before_filter :authenticate 

protected 

def authenticate 
    authenticate_or_request_with_http_basic do |username, password| 
    username == "username" && password == "password" 
    end 
end 

y la prueba predeterminada para la acción index del controlador de mi casa (espec/los controladores/home_controller_spec.rb)

require 'spec_helper' 

describe HomeController do 

describe "GET 'index'" do 
    it "should be successful" do 
    get 'index' 
    response.should be_success 
    end 
end 

de prueba no se ejecuta debido al método de autenticación. Podría comentar "before_filter: autenticar" para ejecutar ellos, pero me gustaría saber si hay manera de hacer que trabajaron con el método.

Gracias!

Respuesta

121

actualización: Matt Connolly ha proporcionado un GIST que también trabaja para solicitar controlador y especificaciones: http://gist.github.com/4158961


Otra forma de hacer esto si tiene muchas pruebas para correr y no desea incluirlo cada vez (código secadora):

Crear un archivo /spec/support/auth_helper.rb:

module AuthHelper 
    def http_login 
    user = 'username' 
    pw = 'password' 
    request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials(user,pw) 
    end 
end 

En la prueba de archivo de especificaciones:

describe HomeController do 
    render_views 

    # login to http basic auth 
    include AuthHelper 
    before(:each) do 
    http_login 
    end 

    describe "GET 'index'" do 
    it "should be successful" do 
     get 'index' 
     response.should be_success 
    end 
    end 

end 

crédito here

+0

buen ejemplo, gracias. –

+1

muestra que la solicitud es nula para mí. alguna idea de cómo obtener una solución alternativa? – chourobin

+6

Para las especificaciones de solicitud, puede tener varias solicitudes, por lo que 'request' es' nil'. En su lugar, debe crear un hash de env 'env = {}', actualizarlo en su método http_login y luego pasar el env explícitamente como en 'get'/', {}, env'. –

17

lo siento, no busco lo suficiente, la solución parece ser la siguiente:

describe "GET 'index'" do 
    it "should be successful" do 
    @request.env["HTTP_AUTHORIZATION"] = "Basic " + Base64::encode64("username:password") 
    get 'index' 
    response.should be_success 
    end 
end 
4

Al utilizar Rspec para probar la uva API, la siguiente sintaxis funciona

 post :create, {:entry => valid_attributes}, valid_session 

donde valid_session es

{'HTTP_AUTHORIZATION' => credentials} 

y

credentials = ActionController::HttpAuthentication::Token.encode_credentials("test_access1") 
1

Estos son grandes soluciones para el regulador y solicitar especificaciones.

Para las pruebas de función por medio de Carpincho, aquí es una solución para hacer el trabajo básico de autenticación HTTP:

especificación

/soporte/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 
+0

¡Muy útil! :) –

4

Algunas respuestas sugieren establecer request.env que es inseguro, porque la solicitud puede ser nil y el resultado final será con private method env' called for nil:NilClass, especialmente cuando se ejecuta pruebas individuales con rspec -e

enfoque correcta será:

def http_login 
    user = 'user' 
    password = 'passw' 
    { 
    HTTP_AUTHORIZATION: ActionController::HttpAuthentication::Basic.encode_credentials(user,password) 
    } 
end 

get 'index', nil, http_login 

post 'index', {data: 'post-data'}, http_login 
Cuestiones relacionadas