Cucumber + Capybara + Jquery: Como esperar requisições Ajax terminarem

Já tive vários problemas com testes de cucumber que quebram intermitentemente pois as vezes não esperam as requisições Ajax terminarem. Em vários casos desistimos desses testes pois não tínhamos achado uma solução.

Porém essa semana dei uma nova pesquisada e achei uma solução que está funcionando bem até agora.

O princípio é usar a função active do Jquery para saber quantas requisições de ajax (feitas pelo Jquery) ainda estão ativas.

Com isso, criei um novo step para meus testes Cucumber:

Given /^I wait for ajax loading$/ do
  5.times do
    break if page.evaluate_script("$.active") == 0
    sleep 1
  end
end

E com isso é só utilizar nos testes assim:

Given I follow "Salvar"
And I wait for ajax loading
Then ...

É isso!

3 comentários: