2008-09-12 6 views

Respuesta

11

Una combinación de utilizar el formato y assert_select en una prueba de integración funciona muy bien:

class ProductsTest < ActionController::IntegrationTest 
    def test_contents_of_xml 
    get '/index/1.xml' 
    assert_select 'product name', /widget/ 
    end 
end 

Para más detalles echa un vistazo a assert_select en la documentación de Rails.

0

Conjunto de los objetos de solicitud aceptan cabecera:

@request.accept = 'text/xml' # or 'application/xml' I forget which 

A continuación, puede valer el cuerpo de la respuesta es igual a lo que se esperaba

assert_equal '<some>xml</some>', @response.body 
+0

Esa parte que sé, en busca de una prueba de integración A..Z –

+1

Eso assert_equal también es muy frágil. No hay garantía de orden de elemento o atributo; si cambia, tu prueba se romperá. La comparación de cadenas literales no es la forma correcta de verificar la igualdad de los árboles XML. – bjnord

5

Ésta es la forma idiomática de probar la respuesta XML un controlador.

class ProductsControllerTest < ActionController::TestCase 
    def test_should_get_index_formatted_for_xml 
    @request.env['HTTP_ACCEPT'] = 'application/xml' 
    get :index 
    assert_response :success 
    end 
end 
+0

Esa es una prueba funcional, que ya tengo. Buscando una prueba de integración. –

1

Estas 2 respuestas son geniales, excepto que mis resultados incluyen los campos de fecha y hora, que son diferentes en la mayoría de las circunstancias, por lo que el assert_equal falla. Parece que necesitaré procesar el include @response.body usando un analizador XML, y luego comparar los campos individuales, el número de elementos, etc. ¿O hay una manera más fácil?

+0

Sí; los campos de fecha y hora son otra razón por la cual assert_equal es la forma incorrecta de comparar árboles XML. Para mí, no he comparado todo el objeto con la igualdad en mis pruebas; He usado assert_select (como ntalbott mostró arriba) para los atributos específicos que quiero verificar. – bjnord

5

La respuesta de ntalbott muestra una acción de obtención. La acción posterior es un poco más complicada; si desea enviar el nuevo objeto como un mensaje XML y tener los atributos XML en el hash de params en el controlador, debe obtener los encabezados correctos. He aquí un ejemplo (Rails 2.3.x):

class TruckTest < ActionController::IntegrationTest 
    def test_new_truck 
    paint_color = 'blue' 
    fuzzy_dice_count = 2 
    truck = Truck.new({:paint_color => paint_color, :fuzzy_dice_count => fuzzy_dice_count}) 
    @headers ||= {} 
    @headers['HTTP_ACCEPT'] = @headers['CONTENT_TYPE'] = 'application/xml' 
    post '/trucks.xml', truck.to_xml, @headers 
    #puts @response.body 
    assert_select 'truck>paint_color', paint_color 
    assert_select 'truck>fuzzy_dice_count', fuzzy_dice_count.to_s 
    end 
end 

Se puede ver aquí que el segundo argumento de la publicación, no tiene que ser un hash de parámetros; puede ser una cadena (que contiene XML), si los encabezados son correctos. El tercer argumento, @headers, es la parte que me llevó a investigar mucho para entender.

(Tenga en cuenta también el uso de to_s al comparar un valor entero en assert_select.)

Cuestiones relacionadas