2013-08-10 41 views
5

Tôi đang gặp phải một khoảng thời gian rất khó khăn để giải quyết vấn đề này, vì vậy mọi trợ giúp sẽ được đánh giá cao.Gỡ lỗi jQuery Ajax trong Dưa chuột + Capybara + PhantomJS trong Rails

Tất cả những gì tôi muốn làm là thử nghiệm một mẫu đăng ký dựa trên Ajax đơn giản trên dự án của tôi. Nếu việc gửi biểu mẫu thành công, bạn sẽ được chuyển hướng đến trang chào mừng. Nếu không, bạn sẽ nhận được các lỗi xác thực thích hợp được liên kết với từng trường vi phạm.

Vì một số lý do kỳ lạ, Capybara không tuân thủ chuyển hướng. Cuộc gọi Ajax đang được thực hiện và tôi thấy một tài khoản mới được đăng ký trong cơ sở dữ liệu, nhưng cuộc gọi lại onSuccess không được gọi hoặc chuyển hướng bị bỏ qua.

Dưới đây là những gì tôi đang cố gắng để làm việc với (vì lợi ích ngắn gọn, tôi đã ngưng tụ mã):

Tính năng:

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

Được rồi, vì vậy, thử nghiệm cụ thể này chỉ chạy tốt cho đến khi chúng tôi chuyển hướng người dùng đến màn hình chào mừng. Tôi đã thử tất cả mọi thứ tôi có thể có thể để xem những gì đang xảy ra bên trong các cuộc gọi lại onSuccess, onFailure, nhưng không có kết quả. Nó giống như mã không được thực thi.

tôi chỉ nhận được đầu ra sau từ chạy thử:

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' 

Nó không quan trọng nếu tôi nâng một ngoại lệ, nó không được nhặt. Không thực hiện cuộc gọi đến console.log() trong các cuộc gọi lại.

Có ai nhìn thấy điều này không? Nếu vậy, có cách giải quyết nào không? Nếu bạn cần thêm thông tin, xin vui lòng chỉ cần hỏi, tôi sẽ rất sẵn lòng cung cấp.

Trả lời

0

Theo số robots at Thoughtbot và những người ở Coderwall, bạn có thể thực hiện việc này bằng phương pháp trợ giúp, được đưa vào spec/support. Họ đặt tên cho mô-đun của họ 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 

từ đó, bạn chỉ cần tải nó vào khuôn khổ thử nghiệm của bạn; cho RSpec, mà có thể được thực hiện hoặc trong spec/tập tin cấu hình hoặc chỉ đơn giản tacking một chút mã vào cuối của tập tin mô-đun:

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

Hãy chắc chắn để yêu cầu spec/support/**/*.rb trong tập tin cấu hình của bạn, nhưng có thể bạn nên làm điều này anyway.

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

Tất nhiên, theo bài viết trên blog ở trên, điều này có thể hoặc có thể không cần thiết ở tất cả, tuỳ theo cách bạn cấu trúc trang của bạn, nếu bạn chỉ cần tìm một selector đó là duy nhất để trang chào mừng của bạn.