Tengo una prueba de integración RSPEC para una aplicación Rails 3.1 que necesita probar una API para un cliente móvil al emitir una solicitud POST con params JSON y un encabezado móvil que necesita usar autenticación HTTP_basic Como el objeto de solicitud no está disponible en una prueba de integración que estoy un poco atascadoRspec Rails 3.1 Prueba de integración. ¿Cómo enviar encabezados de solicitud posterior para dispositivos móviles, autenticación básica http y JSON?
Este es el código que tengo hasta ahora
it "successfully posts scores" do
# request.env["HTTP_ACCEPT"] = "application/json" #This causes an error as request is nly available in controller tests
post "scores", :score => {:mobile_user_id => @mobile_user.id, :points => 50, :time_taken => 7275}.to_json,
:format => :json, :user_agent => 'Mobile', 'HTTP_AUTHORIZATION' => get_basic_auth
end
la solicitud POST no reconoce que estoy utilizando autenticación básica HTTP pero no está seguro si el formato de JSON es correcta. Cualquier ayuda apreció
get_basic_auth es un me4thod ayudante que tiene este aspecto
def get_basic_auth
user = 'user'
pw = 'secret'
ActionController::HttpAuthentication::Basic.encode_credentials user, pw
end
Puedo usar un before_filter en mis controladores que comprueba para móviles y http_basic_authentication que tiene este aspecto
def authorize
logger.debug("@@@@ Authorizing request #{request.inspect}")
if mobile_device?
authenticate_or_request_with_http_basic do |username, password|
username == Mobile::Application.config.mobile_login_name && Mobile::Application.config.mobile_password
end
else
unless current_user
redirect_to login_url, :notice => "Please log in"
end
end
end
consigo una redirigir para iniciar sesión así que obviamente el cabezal móvil no está siendo aceptado, así que no tengo idea de si alguno de los otros encabezados está funcionando
ACTUALIZACIÓN lo descubrió
post("scores", {:score => {:mobile_user_id => @mobile_user.id, :points => 50, :time_taken => 7275}}.to_json,
{"HTTP_USER_AGENT" => "Mobile", 'HTTP_AUTHORIZATION' => get_basic_auth, 'HTTP_CONTENT_TYPE' => "application/json"})
hace el truco muy bien