2013-08-10 10 views
5

Mam bardzo trudny czas, aby owijać głowę wokół tego problemu, więc każda pomoc zostanie bardzo doceniona.Debugowanie aplikacji Ajax jQuery w Cucumber + Capybara + PhantomJS w Railsach

Wszystko, co chcę zrobić, to przetestować prosty formularz rejestracyjny oparty na technologii Ajax na moim projekcie. Jeśli przesłanie formularza powiedzie się, nastąpi przekierowanie do strony powitalnej. Jeśli nie, otrzymasz odpowiednie błędy sprawdzania poprawności powiązane z każdym błędnym polem.

Z jakiegoś dziwnego powodu Capybara nie śledzi przekierowania. Wywoływane jest wywołanie Ajax i widzę nowe konto zarejestrowane w bazie danych, ale wywołanie zwrotne onSuccess albo nie jest w ogóle wywoływane, albo przekierowanie jest ignorowane.

Oto co usiłuję pracować (dla zwięzłości, mam skondensowany kod):

Cecha:

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

Dobrze, więc ten konkretny test działa dobrze, dopóki nie dojdziemy do punktu, w którym mamy przekierować użytkownika na ekran powitalny. Próbowałem wszystkiego, co mogłem, aby zobaczyć, co się dzieje wewnątrz callbacków onSuccess, onFailure, ale bez skutku. To tak, jakby kod nie był nawet wykonywany.

Właśnie uzyskać następujące dane wyjściowe z testu:

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' 

Nie ma znaczenia, jeśli wyjątek, nie odebrano. Połączenia z numerami console.log() również nie są wywoływane.

Czy ktoś to widział? Jeśli tak, czy istnieje obejście? Jeśli potrzebujesz więcej informacji, po prostu zapytaj, będę bardziej niż szczęśliwy, aby zapewnić.

Odpowiedz

0

Zgodnie z robots at Thoughtbot i osobami z Coderwall, można to zrobić za pomocą metody pomocniczej, wstawionej do spec/support. Nazwali swój moduł 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 

stamtąd, wystarczy załadować go do ramy testowej; dla rspec, które mogą być wykonane zarówno w specyfikacji pliku/config lub po prostu sklejaniu bitowego kodu na końcu pliku modułu:

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

upewnij się, aby wymagać spec/support/**/*.rb w pliku konfiguracyjnym, ale prawdopodobnie powinien to zrobić mimo to.

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

Oczywiście, zgodnie z powyższym poście, to może być lub nie być w ogóle potrzebne, w zależności jak skonstruowany swoją stronę, jeśli tylko spojrzeć na selektor, który jest unikalny dla swojej stronie powitalnej.