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