Заглушка запроса XHR для тестирования JavaScript на Capybara - PullRequest
4 голосов
/ 11 августа 2011

Я пытаюсь написать request_spec, который проверяет функциональность страницы с формой, которая выполняет поиск автозаполнения ajax и возвращает действительные результаты, чтобы затем активировать кнопку отправки.

Мне интересно, есть ли у кого-то такая же проблема и найдены ли какие-либо ссылки или ссылки для прохождения этого теста.

Gemfile

gem 'rake', '0.8.7'
gem 'rails', '2.3.5'
group :test do
  gem "capybara", :git => "git://github.com/jnicklas/capybara.git"
  gem 'rspec', '1.3.1'
  gem 'rspec-core'
  gem 'rspec-rails', '1.3.2'
  gem 'webmock', '1.4.0'
end

HTML

    ...
    <fieldset>
      <label>Enter a Destination</label>
      <%= text_field_tag :reviewable_name, nil, :id => "destination_autocomplete", :class => 'textfield'  %>
      <ul>
        <li>
          <h3 class="disabled">
            <%= submit_tag "Read reviews", :id => "read_a_destination_review", :name => "agree", :class => "read_review", :disabled => false %>
          </h3>
        </li>
        <li class="or">or</li>
        <li>
          <h3>
            <%= submit_tag "Write review", :id => "write_a_destination_review", :name => "agree", :class => "write_review", :disabled => false %>
          </h3>
        </li>
      </ul>
    </fieldset>
    ...

JavaScript (jQuery 1.4.4)

  ...
  $("#hotel_autocomplete, #destination_autocomplete").autocomplete({
    source: function(request, response){
      $.getJSON('/ajax/search_reviewable?type=destination&q=' + request.term,
        function(results, status){
          if(status == 'success'){
            //make it regex safe
            var term = request.term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1");
            term = term.split(' ').join('|');
            for(var i = 0; i < results.length; i++){
              results[i].value = results[i].label;
              results[i].label = results[i].value.replace(new RegExp("("+term+")", "gi"),'<strong>$1</strong>');
            }
            response(results);
          }
        }
      );
    },
    minLength: 3,
    delay: 500,
    select: function( event, ui ) {...}
  });
  ...

JSON Response

/ Ajax / search_reviewable? Тип = назначения & д = 1017 * Флорида *

[{"label":"Florida","id":124}]

Тест RSpec

    it "should activate submit button", :js => true do
      stub_request(:get, "/ajax/search_reviewable/type=destination&q=florida").to_return(:body => %Q{[{"label":"Florida","id":124}]}, :headers => {"Content-Type" => "applicaation/json; charset=utf-8", "Accept" => "*/*"})
      fill_in("destination_autocomplete", :with => "florida")
      page.execute_script(%Q{$("#destination_autocomplete").trigger("keyup");})
      find(".ui-menu-item a").click
      # should post to '/review/new', :id => 124
      page.should have_content("Write a Destination Review")
    end

Тест не пройден, так как эта спецификация не может заглушить XHR-запрос в JavaScript.

Я благодарю вас за ваши комментарии, комментарии и помощь.

1 Ответ

0 голосов
/ 12 августа 2011

Мне удается найти решение этой проблемы.

Что на самом деле происходит? Страница запроса AJAX /ajax/search_reviewable?type=destination&q=$1 выполняла запрос Net :: HTTP к другой службе.

Этот запрос нужно было заглушить тем ответом, который мне был нужен.

stub_request(:get, ".../all_by_partial_name/Florida/").to_return({
  :body => %Q{[{"label":"Florida","id":124}]}, 
  :headers => {"Content-Type" => "applicaation/json; charset=utf-8", "Accept" => "*/*"}
})

После некоторых серьезных исследований я обнаружил, что вам нужно вызвать событие в JavaScript, чтобы пройти тест.

Источник. Нажатие списка параметров автозаполнения

Теперь пример спецификации выглядит следующим образом

before(:each) do
  stub_request(:get, ".../all_by_partial_name/Florida/").to_return({
    :body => %Q{[{"label":"Florida","id":124}]}, 
    :headers => {"Content-Type" => "applicaation/json; charset=utf-8", "Accept" => "*/*"}
  })
end

it "should activate submit button and direct to new review", :js => true do
  fill_in("destination_autocomplete", :with => "florida")
  sleep 2
  page.execute_script(%Q{$(".ui-menu-item a:eq(0)").trigger("mouseenter").click();})
  find_button("write_a_destination_review").click
  page.should have_content("Write a Destination Review")
end

Надеюсь, это поможет вам решить проблемы RSpec JQuery.

...