rails formularios anidados ruby-on-rails-3 header cucumber jquery-mobile capybara

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 ".

https://github.com/jnicklas

https://github.com/jnicklas/capybara


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)