2011-11-04 7 views
13

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

Respuesta

8

me di cuenta de lo que tenía que hacer

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"} 

Obviamente no se necesita el agente de usuario "móvil" para poner a prueba solicitudes json normales.

Espero que ayude a alguien

Cuestiones relacionadas