with spec run rails describe xml ruby integration-testing

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