2013-08-10 12 views
5

Sto attraversando un periodo molto difficile per risolvere questo problema, quindi qualsiasi aiuto sarà molto apprezzato.Debug di jQuery Ajax in Cucumber + Capybara + PhantomJS in Rails

Tutto ciò che voglio fare è testare un semplice modulo di registrazione basato su Ajax sul mio progetto. Se l'invio del modulo ha esito positivo, si viene reindirizzati a una pagina di benvenuto. In caso contrario, si ottengono gli errori di convalida appropriati associati a ciascun campo offensivo.

Per qualche strana ragione, Capybara non sta seguendo il reindirizzamento. La chiamata Ajax è in corso e vedo un nuovo account registrato nel database, ma il callback onSuccess non viene chiamato o il reindirizzamento viene ignorato.

Ecco quello che sto cercando di lavorare con (per brevità, ho condensato il codice):

Caratteristica:

Feature: Registration 
    In order to obtain a new account 
    As a prospective customer 
    I must submit a valid registration form. 

    @javascript 
    Scenario: A valid registration attempt 
     Given an account registration form 
     When I complete the form with valid values 
     Then I should be redirected to the welcome screen 

prova:

Given(/^an account registration form$/) do 
    visit("/signup") 
    assert current_path == "/signup" 
end 

When(/^I complete the form with valid values$/) do 
    within("#signupForm") do 
    fill_in("email", :with => Faker::Internet.email) 
    fill_in("name",  :with => Faker::Name.name) 
    fill_in("password", :with => "11111111") 

    click_link("signupFormSubmit") 
    end 
end 

Then(/^I should be redirected to the welcome screen$/) do 
    assert current_path == "/welcome" 
end 

JavaScript:

console.log('I am not yet inside you.') 

$.post(url, form.serialize(), function(response) { 
    // everything went well 
    // let's redirect them to the given page 
    window.location.replace(response.redirectUrl) 
    console.log('I am inside you and it is good.') 
}, function(response) { 
    // collect error responses from API 
    // apply error hints to associated fields 
    console.log('I am inside you and something went wrong.') 
}) 

Va bene, quindi questo particolare test funziona bene fino a quando non arriviamo al punto in cui dovremmo reindirizzare l'utente alla schermata di benvenuto. Ho provato tutto il possibile per vedere cosa succede all'interno dei callback onSuccess, onFailure, ma senza successo. È come se il codice non venisse nemmeno eseguito.

ottengo solo il seguente output dal test:

Then I should be redirected to the welcome screen # features/step_definitions/registration.rb:51 
    Failed assertion, no message given. (MiniTest::Assertion) 
    ./features/step_definitions/registration.rb:52:in `/^I should be redirected to the welcome screen$/' 
    features/registration.feature:15:in `Then I should be redirected to the welcome screen' 

Non importa se alzo un'eccezione, non ottiene raccolse. Né effettuare le chiamate a console.log() all'interno dei callback.

Qualcuno ha visto questo? Se è così, c'è una soluzione? Se hai bisogno di ulteriori informazioni, ti preghiamo di chiedere, sarò più che felice di fornire.

risposta

0

Secondo lo robots at Thoughtbot e le persone in Coderwall, è possibile farlo con un metodo di supporto, inserire in spec/support. Hanno chiamato loro modulo WaitForAjax:

# spec/support/wait_for_ajax.rb 
module WaitForAjax 
    def wait_for_ajax 
    Timeout.timeout(Capybara.default_wait_time) do 
     loop until finished_all_ajax_requests? 
    end 
    end 

    def finished_all_ajax_requests? 
    page.evaluate_script('jQuery.active').zero? 
    end 
end 

da lì, è sufficiente caricarlo nel vostro quadro di prova; per Rspec, che può essere fatto sia nel file spec/config o semplicemente virando un po 'di codice alla fine del file modulo:

RSpec.configure do |config| 
    config.include WaitForAjax, type: :feature 
end 

Assicuratevi di richiedere spec/support/**/*.rb nel file di configurazione, ma probabilmente dovrebbe farlo comunque.

http://www.elabs.se/blog/53-why-wait_until-was-removed-from-capybara

Naturalmente, secondo il post sul blog di cui sopra, questo può o non può essere necessario a tutti, a seconda di come si strutturato la tua pagina, se si guarda per un selettore che è unica alla tua pagina di benvenuto.

Problemi correlati