spec - ¿Cómo configurar una prueba de integración de Rails para métodos XML?
ruby server (5)
Dado un método de control como:
def show
@model = Model.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => model }
end
end
¿Cuál es la mejor manera de escribir una prueba de integración que afirme que la devolución tiene el XML esperado?
Establezca el encabezado accept de los objetos de solicitud:
@request.accept = ''text/xml'' # or ''application/xml'' I forget which
Entonces puedes afirmar que el cuerpo de respuesta es igual a lo que esperabas
assert_equal ''<some>xml</some>'', @response.body
Una combinación de usar 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 obtener más detalles, consulte assert_select en los documentos de Rails.
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 assert_equal falla. Parece que necesitaré procesar @ 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?
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. Aquí hay 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
Puedes ver aquí que el segundo argumento para publicar no tiene que ser un parámetro hash; 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)
Esta es la forma idiomática de probar la respuesta xml de 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