2009-11-12 19 views
7

Estoy intentando enviar contenido XML mediante POST a un método de controlador ('Parse') ('índice') en un proyecto simple de Rails. No es RESTful ya que mi nombre de modelo es diferente, por ejemplo, 'autos'. Tengo el siguiente en una prueba funcional que funciona:HTTP POST Contenido XML de pepino

def test_index 
    ... 
    data_file_path = File.dirname(__FILE__) + 
     '/../../app/views/layouts/index.xml.erb' 

    message = ERB.new(File.read(data_file_path)) 
    xml_result = message.result(binding) 
    doc = REXML::Document.new xml_result 

    @request.env['RAW_POST_DATA'] = xml_result 
    post :index 
    assert_response :success 
end 

Ahora estoy tratando de pepino (0.4.3), y me gustaría saber cómo puedo simular la solicitud POST en una cláusula "Cuando". Sólo tengo un método de controlador de 'índice', y tengo el siguiente en config/routes.rb:

ActionController::Routing::Routes.draw do |map| 
    map.connect ':controller/:action/:id' 
    map.connect ':controller/:action/:id.:format' 
end 
  1. webrat dentro de pepino es sólo para HTML, y no puedo hacer Post?
  2. @request variable no está disponible en el entorno de pepino?
  3. Si utilizo algo como 'índice de visita' (asumiendo que es controlador de Parse, método de índice) en funciones/step_definitions/car_steps.rb, me sale el siguiente error:

undefined method `index' for # (NoMethodError)

Cualquier sugerencia cómo hacer pruebas de integración con Cucumber para HTTP POST con contenido XML.

+0

@mbuf, si una de las respuestas resolvió su problema, debe marcarla como "respondida" haciendo clic en la marca de verificación debajo del área de votación. –

+0

Hecho. ¡Gracias por hacérmelo saber! – mbuf

+0

He publicado cómo probar JSON POST usando Rails y pepino aquí: http://stackoverflow.com/questions/5098626/how-to-test-posts-in-rails-capybara-cucumber-or-rspec/10404063# 10404063 –

Respuesta

11

Webrat no lo ayudará aquí, es para interacciones basadas en navegador, así que si está especificando una API no será de ayuda.

Puede usar 'publicar' en Pepino, pero debe proporcionar la ruta completa a la acción, no solo la acción. Además, pase el encabezado Content-type para que Rails sepa que está pasando en XML.

post("/controller/index", xml_result, {"Content-type" => "text/xml"}) 

En el lado respuesta, puede hacer lo siguiente:

response.should be_success 
+0

¡Bingo! Gracias por tu ayuda. – mbuf

+0

Aceptado. ¡Gracias por su respuesta! – mbuf

12

solución de Patrick Ritchie me ayudó también, pero que tenía que hacer una pequeña modificación para que funcione con Rails 3.

post("/controller/index", xml_result, {"CONTENT_TYPE" => "text/xml"}) 

Creo que esto se debe a que, en v3, Rails está más integrado con Rack.

1

Muchas gracias chicos, he pasado todo el día maldiciendo. Agregaré un ejemplo con autenticación básica y con json, si otras personas que yo lo estoy buscando. Por cierto, ambos application/xml y text/xml funciona, pero para json necesita application/json.

post("/myresource.xml", 
    some_xml_string, 
    {"CONTENT_TYPE" => "text/xml", 
     "HTTP_AUTHORIZATION" => ActionController::HttpAuthentication::Basic.encode_credentials("user", "secret")}) 

y JSON

post("/myresource.json", 
     some_json_string, 
     {"CONTENT_TYPE" => "application/json", 
     "HTTP_AUTHORIZATION" => ActionController::HttpAuthentication::Basic.encode_credentials("user", "secret")}) 

y utilizo estos en spec/requests sin ningún webrat o capibara cosas navegador.