2011-10-07 6 views
11

Estoy escribiendo una especificación de solicitud y me gustaría probar la presencia de la cadena "Informes» Informes de antigüedad ". Me aparece un error (no válido carbón de varios bytes) si pongo en el personaje de mi expresión de coincidencias directamente, por lo que he intentado esto: page.should have_content("Reports » Aging Reports")Prueba de Rspec para entidades html en el contenido de la página

esto falla la prueba con el mensaje:

expected there to be content "Reports » Aging Reports" in "\n Reports » Aging Reports\n

I' he intentado cosas como .html_safe sin éxito. ¿Hay alguna manera de probar el texto que contiene entidades html?

Editar:

Aquí está el área correspondiente de la fuente html:

<a href="/reports">Reports</a> &raquo; <a href="/aging_reports">Aging Reports</a>

+0

Eso es probablemente porque el código HTML contiene un '» 'y no un' '». Cambia el HTML para que uses '»' en lugar de '» '. ¿Cuál es el HTML prestado real? ¿Es la parte '» 'de la fuente HTML o está definida como' » 'en la fuente HTML? Por favor, muéstranos el código fuente HTML. No estoy seguro de por qué el "esperado" muestra '»' en lugar de '»', sin embargo. – Zabba

+0

El HTML es en realidad » El » es otra forma de la entidad » que probé, pero he actualizado la pregunta. – MWean

+0

Parece que RSpec está convirtiendo '»' en '» 'para usted. Intenta incluir el personaje real en tu prueba. – thomasfedb

Respuesta

1

he encontrado una solución para el momento que utiliza una expresión regular en lugar de una cadena:

find('#breadcrumbs').text.should match(/Reports . Aging Reports/)

Esto obtiene el texto del breadcrumbs div, que contiene el texto I ' Estoy buscando, por lo que el alcance del partido es limitado. Esto funciona bien, pero aún me encantaría saber cómo unir entidades html específicas.

6

Usted puede tener el aspecto de prueba a la fuente prima de su página también:

breadcrumb = '<a href="/reports">Reports</a> &raquo; <a href="/aging_reports">Aging Reports</a>' 
page.body.should include(breadcrumb) 
expect(page.body).to include(breadcrumb) # rspec 2.11+ 

Con eso dicho que no estoy seguro de que es la solución más elegante. Suponiendo que hay una clase llamada .breadcrumb alrededor de los enlaces que sólo pudo validar los enlaces están presentes dentro de la div:

within '.breadcrumb' do 
    page.should have_css('a', text: 'Reports') 
    page.should have_css('a', text: 'Aging Reports') 
    expect(page).to have_css('a', text: 'Reports') # rspec 2.11+ 
    expect(page).to have_css('a', text: 'Aging Reports') # rspec 2.11+ 
end 

De esta manera se busca explícitamente a href dentro del bloque de miga de pan.

3

html_safe no elimina las etiquetas html si eso es lo que quieres.

Si va a eliminar las etiquetas html antes de probar, puede usar la gema sanitize.

# in Gemfile 
gem 'sanitize' 

# in testfile 
require 'sanitize' 
html = Sanitize.clean(page.body.text) 
html.should have_content("Reports &raquo; Aging Reports") 
0

veces la solución más simple es la correcta y las cosas funcionan ...

page.should have_content("Reports » Aging Reports") 
Cuestiones relacionadas