2013-08-10 7 views
5

Ich habe eine sehr schwierige Zeit, meinen Kopf um dieses Problem zu wickeln, so dass jede Hilfe sehr geschätzt wird.Debugging von jQuery Ajax in Gurke + Capybara + PhantomJS in Rails

Alles, was ich tun möchte, ist ein einfaches Ajax-basiertes Registrierungsformular auf meinem Projekt zu testen. Wenn die Formularübermittlung erfolgreich ist, werden Sie auf eine Begrüßungsseite weitergeleitet. Wenn dies nicht der Fall ist, erhalten Sie die entsprechenden Validierungsfehler für jedes beanstandete Feld.

Aus irgendeinem Grund folgt Capybara nicht der Weiterleitung. Der Ajax-Anruf wird ausgeführt, und ich sehe ein neues Konto in der Datenbank registriert, aber der Rückruf onSuccess wird entweder überhaupt nicht aufgerufen oder die Weiterleitung wird ignoriert. Hier

ist das, was ich versuche, mit zu arbeiten (der Kürze halber habe ich den Code kondensiert):

Eigenschaft:

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 

Test:

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.') 
}) 

In Ordnung, so läuft dieser spezielle Test gut bis wir zu dem Punkt kommen, wo wir den Benutzer auf den Begrüßungsbildschirm umleiten sollen. Ich habe versucht alles, was ich kann, um zu sehen, was in den onSuccess, onFailure Callbacks passiert, aber ohne Erfolg. Es ist so, als würde der Code nicht einmal ausgeführt.

bekomme ich nur die folgende Ausgabe aus dem Testlauf:

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' 

Es spielt keine Rolle, ob ich eine Ausnahme auslösen, es aufsteht nicht abgeholt. Auch die Aufrufe an console.log() innerhalb der Rückrufe nicht.

Hat jemand das gesehen? Wenn ja, gibt es einen Workaround? Wenn Sie mehr Informationen benötigen, bitte nur fragen, ich werde mehr als glücklich sein, zur Verfügung zu stellen.

Antwort

0

Entsprechend der robots at Thoughtbot und den Menschen bei Coderwall können Sie dies mit einer Hilfsmethode tun, in spec/support setzen. Sie nannten ihr Modul 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 

von dort aus, die Sie gerade in Ihren Test-Framework laden müssen;

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

Stellen Sie sicher, erfordern spec/support/**/*.rb in Ihrer Konfigurationsdatei, aber wahrscheinlich: für Rspec, das kann entweder in der spec/config-Datei oder einfach durch Anheften ein Stück Code an das Ende der Moduldatei erfolgen sollte das trotzdem machen.

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

Natürlich nach der obigen Blog-Post, kann dies oder gar nicht benötigt werden, je nachdem, wie Sie Ihre Seite strukturiert, wenn Sie nur für einen Wähler sehen, die auf Ihre Begrüßungsseite einzigartig sind.

Verwandte Themen