ruby on rails - tag - RoR: probar una acción que utiliza autenticación de token http
token authentication ruby on rails (1)
Supongo que ApiKey es un modelo ActiveRecord, ¿correcto? El comando curl se ejecuta en la base de datos de desarrollo y las pruebas van en contra de la base de datos de prueba. No puedo ver nada de lo que configura ApiKey en tus fragmentos. A menos que lo tenga en otro lugar, intente agregar algo en este sentido:
it "passes the token" do
# use factory or just create record with AR:
ApiKey.create!(:access_token => ''test_access1'', ... rest of required attributes ...)
# this part remains unchanged
get :new, nil,
:authorization => ActionController::HttpAuthentication::Token.encode_credentials("test_access1")
assigns(:token).should be "test_access1"
end
Más tarde puede moverlo a before :each
bloque o módulo de soporte.
ACTUALIZAR:
Después de ver tu comentario tuve que mirar más profundo. Aquí hay otra conjetura. Esta forma de get
get ''/path'', nil, :authorization => ''string''
Debería funcionar solo en pruebas de integración. Y para las pruebas de control, la preparación de autenticación debería verse así:
it "passes the token" do
request.env[''HTTP_AUTHORIZATION''] = ActionController::HttpAuthentication::Token.encode_credentials("test_access1")
get :new
assigns(:token).should be "test_access1"
end
Las razones detrás de esto provienen de las firmas de métodos para los respectivos módulos de prueba:
# for action_controller/test_case.rb
def get(action, parameters = nil, session = nil, flash = nil)
# for action_dispatch/testing/integration.rb
def get(path, parameters = nil, headers = nil)
Estoy intentando probar un controlador que usa una autenticación de token http en el filtro anterior. Mi problema es que funciona bien, aunque uso curl para pasar el token, pero en mis pruebas siempre falla (uso rspec por cierto). Intenté una prueba simple para ver si el token se estaba pasando, pero parece que no lo está haciendo. ¿Me falta algo para que la prueba pase el token al controlador?
Aquí está mi filtro anterior:
def restrict_access
authenticate_or_request_with_http_token do |token, options|
api_key = ApiKey.find_by_access_token(token)
@user = api_key.user unless api_key.nil?
@token = token #set just for the sake of testing
!api_key.nil?
end
end
Y aquí está mi prueba:
it "passes the token" do
get :new, nil,
:authorization => ActionController::HttpAuthentication::Token.encode_credentials("test_access1")
assigns(:token).should be "test_access1"
end