ruby on rails 3 - formularios - Capibara no pasa el encabezado después del envío del formulario
rails formularios (2)
Estoy construyendo una aplicación de Rails 3 que rinde diferentes vistas para dispositivos móviles (usando jQuery Mobile) y navegadores de escritorio normales. Estoy probando con Cucumber / Capybara, y tengo suites de prueba separadas para dispositivos móviles y navegador. Puedo configurar una cadena de agente de usuario móvil en el encabezado HTTP de la solicitud simplemente usando el ''hackeo de encabezados'' que se encuentra aquí ...
Usando Cucumber / Capybara in Rails 3, ¿cómo configuro una cadena de User-Agent personalizada?
El problema...
La mayoría de mis pasos móviles de pepino funcionan bien (por ejemplo, configuro el encabezado móvil en un paso, a partir de ahí se renderizan las vistas móviles). Sin embargo, después de enviar un formulario, la prueba muestra una vista de navegador del siguiente paso (no la vista móvil que quiero). Creo que esto puede deberse a que Capybara deja caer el encabezado después de una acción de envío de formularios.
Traté de probar esto agregando un registrador a la acción de mi controlador para poder ver los encabezados user_agent, de la siguiente manera:
def show
# …
logger.info("Headers: #{request.user_agent}")
# …
end
Usé un encabezado de iPhone (el comprador es el recurso). En mi test.log veo:
Para la acción de crear ...
Started POST "/buyers" for 127.0.0.1 at 2011-04-19 16:49:18 -0700
Processing by BuyersController#create as HTML
#...
Headers: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7
#...
Redirected to http://www.example.com/buyers/1
Completed 302 Found in 7ms
Para la acción show posterior (nota ''Encabezados:'' está en blanco) ...
Started GET "/buyers/1" for 127.0.0.1 at 2011-04-19 16:49:18 -0700
Processing by BuyersController#show as HTML
#...
Headers:
#...
Completed 200 OK in 4ms (Views: 2.8ms | ActiveRecord: 1.4ms)
Como era de esperar, el paso "mostrarme la página" luego muestra la página del navegador, no la página móvil que quiero.
¿Cómo puedo preservar el encabezado para que todos mis pasos móviles se ejecuten en mi suite de prueba móvil?
Actualizar
¡Jnicklas (creador de la joya de Capybara verdaderamente impresionante!) Responde:
"Esto es más una pregunta que un problema, tbh. En Rack-Test, actualmente no hay forma de lograr este corto de parches de mono que yo sepa. He estado pensando en agregar una opción de encabezado al controlador de prueba en rack, lo que permitiría el paso de diferentes opciones de encabezado. Si está usando mucho JavaScript, el Selenium podría ser una mejor opción de todos modos y le permite configurar el agente de usuario libremente, IIRC ".
Así es como lo solucionamos, para trabajar con javascript también (nota, use remove_headers
en su bloque After
):
module CapybaraHeadersHelper
def add_headers(headers)
headers.each do |name, value|
case page.driver.class.to_s
when "Capybara::RackTest::Driver"
page.driver.options[:headers] ||= {}
page.driver.options[:headers][name.to_s] = value
when "Capybara::Driver::Webkit"
page.driver.browser.header name, value
end
end
end
def remove_headers(headers)
headers.each do |name|
case page.driver.class.to_s
when "Capybara::RackTest::Driver"
page.driver.options[:headers] ||= {}
page.driver.options[:headers].delete name.to_s
when "Capybara::Driver::Webkit"
page.driver.browser.header name, nil
end
end
end
end
World(CapybaraHeadersHelper)
Esta característica se agregó a Capybara el 25 de abril de 2011 con este compromiso - https://github.com/jnicklas/capybara/commit/a00435d63085ac2e74a0f64e7b7dedc0f7252ea9
Ahora puede especificar un encabezado personalizado cuando usa un controlador de Capybara personalizado. Consulte http://automagical.posterous.com/creating-a-custom-capybara-driver para ver ejemplos de código.