vulnerability seccion race ejemplo critica condicion concurrencia carrera ruby-on-rails ruby-on-rails-3 rspec tdd capybara

ruby on rails - seccion - Condiciones de carrera de carpincho ajax



race condition vulnerability (1)

Tuve problemas con esto hace un tiempo, y utilicé este enfoque para descubrir cuándo terminaron las solicitudes de Ajax:

wait_until do page.evaluate_script(''$.active'') == 0 end

Todavía bastante hacky, pero un poco mejor que usar el sleep . Lo obtuve de aquí . Lo estoy usando para las características de Cucumber, pero también debería funcionar en las especificaciones de solicitud rspec.

Actualización (19/06/2013)

wait_until fue eliminado de Capybara en la versión 2.0, ver: ¿Por qué wait_until fue eliminado de Capybara para obtener detalles sobre por qué?

Seguí una de las sugerencias y la implementé de todos modos, solo para este caso (que creo que está justificado):

def wait_until require "timeout" Timeout.timeout(Capybara.default_wait_time) do sleep(0.1) until value = yield value end end

Frecuentemente me encuentro con problemas en el capibara con fallas en las pruebas de solicitud porque el capibara no está esperando que los eventos ajax se completen antes de continuar.

Google parece indicar que debería estar usando: la opción resincronizar para mis pruebas para solucionar esto. Pero no está funcionando.

Para demostrar que esto es un problema, las pruebas fallidas se pueden solucionar al poner una declaración sleep después de la llamada ajax. Esto parece una mala práctica, ya que la demora apropiada puede variar dependiendo de la velocidad de la máquina que ejecuta las pruebas. Y elegir un valor adecuadamente grande ralentizará seriamente la ejecución de una serie de pruebas con muchas acciones ajax.

Un ejemplo de prueba de falla / aprobación está debajo. La suspensión antes de hacer clic en guardar hace la diferencia entre pasar / fallar en la página. Debe tener_contenido (''elemento personalizado''):

it "should be able create a new todo item", :js, :resynchronize, :focus do # Visit new action visit new_todo_list # Fill in the name fill_in "#name", "test list" # Click on add item to launch inline popup find(''a.add-item'').click within ''#new_item'' do fill_in ''todo_item_description'', :with => ''custom item'' # Run ajax action to add currrent item find(''.btn'').click end sleep(1) # Save find(''a.save'').click page.should have_content(''test list'') page.should have_content(''custom item'') end

¿Es esto un error en el capibara o estoy haciendo algo mal?

Gracias por cualquier ayuda...