2012-07-03 10 views
19

Estoy escribiendo una prueba de Capybara y utilizando Rspec para las aserciones. Mi prueba está fallando porque se está aplicando un estilo CSS que está causando que el texto esté en mayúsculas. ¿Cómo puedo reescribir esto para que sea una afirmación insensible a mayúsculas y minúsculas?Emparejamiento de Rspec insensible a mayúsculas

"ALL CAPS".should include('All Caps') 

Respuesta

27

Aquí está mejorando en la solución de phoet:

page.body.should match(%r{#{string}}i) 

Por desgracia, el resaltado de sintaxis aquí no lo está haciendo mucha justicia (se ve perfectamente bien en Sublime Text)

+0

hermosa solución – bruno077

+0

Esto también funciona en los buscadores de Capybara. Por ejemplo: 'page.find 'li.line-item', texto:% r {Awesome Line Item} i' –

+2

o' page.find 'li.line-item', text:/# {Awesome Line Item }/i' si prefieres la sintaxis de barra. (Agregue paréntesis alrededor de la expresión regular en Sublime Text para obtener el resaltado de sintaxis adecuado). – LouieGeetoo

6

¿qué tal usar una expresión regular para hacer esto?

"ALL CAPS".should match(/#{Regexp.escape('All Caps')}/i) 
3

¿Qué tal minar ambos extremos de la afirmación?

"ALL CAPS".downcase.should include('All Caps'.downcase) 
+0

esta solución fue en realidad la más versátil en diferentes escenarios de coincidentes con los que me encontré.Aunque es un poco feo, funciona – Andrew

+0

, puedes abstraerlo a un método personalizado si quieres ocultar un poco de la fea – bruno077

2

Además, si usted está usando Capybara, puede usar el matcher have_content que no distingue entre mayúsculas y minúsculas:

<h1>ALL CAPS</h1> 

find('h1').should have_content('All Caps') 

Actualización: supongo que estaba equivocada en parte. Considere esto:

<h1 style="text-transform: uppercase">Title Case</h1> 

puts find('h1').text 
# TITLE CASE < notice all caps 

puts find('h1').has_content?('Title Case') # true 

puts find('h1').has_content?('TITLE CASE') # false 

puts find('h1').has_content?('title case') # false 

Es extraño que el texto es devuelto en todas las tapas (cómo está diseñado despues de CSS), pero el matcher es en realidad probando en contra del texto en el código HTML sin estilo. Pasé un tiempo investigando el código fuente y todavía no puedo entender por qué funciona.

+0

¿Qué versión de Capybara es esta? No recuerdo que Capybara tenga adaptadores que no distingan entre mayúsculas y minúsculas por defecto – prusswan

+0

¿está usando webrat también? – prusswan

+0

hmm, sugiero que haga un chequeo con 'puts find ('h1'). Text' y/o' puts find ('h1'). Inspect' para ver exactamente qué se encuentra. Por mi parte, recibo 'ALL CAPS', que falla correctamente en tu ejemplo. – prusswan

7

que sólo se encuentra con este problema cuando:

  • utilizando el controlador de poltergeist. (No sé si esto también ocurre con otros conductores)

  • Inspección page, no page.body para las expectativas: expect(page).to ...

Por lo tanto, si hago expect(page.body).to ... simplemente funciona y resolvió el problema.

+2

¡Este fue exactamente el problema para mí, gracias! – mistertim

3

La sintaxis Rspec ha cambiado significativamente en 4 años, pero este problema subyacente todavía parece ser un problema. Mi solución fue construir un marcador personalizado has_content_i, que era como has_content pero no distingue mayúsculas de minúsculas. La llamada resultante se parece a:

expect(page).to have_content_i("All Caps") 

Aquí está la fuente:

RSpec::Matchers.define :have_content_i do |expected| 
    match do |actual| 
    actual.text =~ /#{Regexp.quote expected}/i 
    end 

    failure_message do |actual| 
    "expected to find text #{expected.inspect} case insensitively in #{actual.text.inspect}" 
    end 

    failure_message_when_negated do |actual| 
    "expected to not to find text #{expected.inspect} case insensitively in #{actual.text.inspect}" 
    end 
end 

http://danielchangnyc.github.io/blog/2014/01/15/tdd2-RSpecMatchers/ tiene información sobre dónde esconder las definiciones matcher personalizada en el árbol del proyecto.

Cuestiones relacionadas