Trabalhando com verificações e esperas de elementos com o Capybara,SitePrism e Rspec.(Parte III).
Este post sobre wait_for_ajax é uma tradução do post original da Thoughtbot.
Wait_for_ajax
Capybara é muito bom em esperar por AJAX. Por exemplo, esse código continuará verificando a página do elemento para Capybara.default_max_wait_time segundos, permitindo que as chamadas AJAX terminem:
Mas há momentos em que isso não é suficiente. Por exemplo, neste código:
Temos uma condição de corrida entre click_link e reload_page. Às vezes, a chamada AJAX passa antes que a Capybara recarregue a página, e às vezes não. Esse tipo de teste não determinístico pode ser muito difícil de debugar, então eu adicionei um pequeno helper.
Helper:
Nós automaticamente incluímos todos os arquivos em /support em nosso helper.rb, então este arquivo é automaticamente requerido. Como apenas as especificações de recursos podem interagir com a página por meio de JavaScript ,O auxiliar usa a variável jQuery.active, que rastreia o número de solicitações AJAX ativas. Quando é 0, não há solicitações AJAX ativas, o que significa que todas as solicitações foram concluídas.
Veja como eu uso:
Agora não há nenhuma condição de corrida: a Capybara irá esperar que a solicitação de amizade do AJAX seja concluída antes de recarregar a página.
Se for usar dentro de um page objects basta incluir o módulo
Não há documentação oficial no jQuery.active, pois é uma variável interna, mas essa resposta do Stack Overflow é útil. Para ver como precisamos de todos os arquivos na especificação / suporte, leia nosso modelo spec_helper.
Créditos:
Agradecemos a Jorge Dias e Ancor Cruz, da Coderwall, pelas implementações auxiliares originais e refatoradas.