2011-11-29 19 views
6

quiero hacer algunas comprobaciones básicas para asegurar que un mapa del sitio XML está siendo producido correctamente, pero have_selector no parece ser capaz de detectar etiquetas:¿Cómo se usa el método rspec have_selector para verificar XML?

require 'spec_helper' 

describe SitemapController do 

    render_views 

    before(:all) do 
    # code to generate factory data 
    # ... 
    end 

    # illustrating the problem 
    it "should be able detect nodes that are definitely present" do 
    get :index 
    response.should have_selector('url') 
    end 
end 

cada vez que ejecute la prueba me sale el siguiente error :

RSpec::Expectations::ExpectationNotMetError: expected css "url" to return something 

el mapa se está produciendo y cuando puedo depurar la prueba RSpec y mirar el objeto response puedo ver el contenido xml:

ruby-1.9.2-p180 :001 > response.body 
=> "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n <url>\n <loc>http://test.host/panel ... 

Mi mapa del sitio está producido por SitemapController y la vista se encuentra en views/sitemap/index.builder.xml.

¿Por qué have_selector no está pateando?

Respuesta

3

Capybara no admite respuestas XML. Siempre usa Nokogiri::HTML para analizar el contenido, lo que produce resultados inesperados cuando se le da XML.

La adición de soporte XML tiene been requested pero fue rechazado por el mantenedor de Capybara.

+0

. Esto es muy útil, gracias John. ¿Sabes qué enfoque debes tomar entonces en lugar de Capibara? No me di cuenta de que uno necesitaba un simulador de navegador en absoluto ya que todo lo que quiero hacer es analizar el documento - ty –

2

Use should have_xpath('//url') en su lugar. have_selector es para CSS.

Consulte the Capybara README para obtener más información.

+0

Hola David. Todavía tengo el mismo problema con 'response.should have_xpath ('// url')' devuelve 'expected xpath" // url "para devolver algo'. Para patear Capybara, incluso intenté agregar la etiqueta ': type =>: request' a la prueba, pero aún falla –

1

Por lo que puedo decir, el have_selector (o have_xpath) solo puede provenir de Webrat o Capybara. Tiene razón en su comentario a John de que no necesita un simulador de navegador para probar la API.

Puede estar invocando Webrat o Capybara por error, ya que utilizan visit en lugar de get AFAIK. Por lo tanto, es posible que las variables con las que coinciden nunca hayan sido rellenas por la página y siempre devuelvan falso.

Los raíles deben manejar el documento XML de forma nativa si el tipo de contenido de respuesta está configurado correctamente en XML. Intente utilizar el assert_tag o el assert_content auxiliar de prueba como control básico.

me acaba de utilizar Nokogiri para analizar el XHTML y ejecutar las pruebas normales RSpec en contra de que:

xml = Nokogiri::XML(response.body) 
xml.css("expression").size.should == 1 
+0

Muy útil, gracias Andrew. Lo intentaré y te contaré cómo resulta –

Cuestiones relacionadas