Как вы используете метод rspec have_selector для проверки XML? - PullRequest
6 голосов
/ 29 ноября 2011

Я хочу провести базовую проверку, чтобы убедиться, что карта сайта XML создается правильно, но have_selector, похоже, не в состоянии обнаружить теги:

require 'spec_helper'

describe SitemapController do

  render_views

  before(:all) do
    # code to generate factory data
    # ...
  end

  # illustrating the problem
  it "should be able detect nodes that are definitely present" do
    get :index
    response.should have_selector('url')
  end
end

Каждый раз, когда я запускаю тест, я получаю следующую ошибку:

RSpec::Expectations::ExpectationNotMetError: expected css "url" to return something

Карта сайта создается, и когда я отлаживаю тест RSpec и смотрю на объект response, я вижу содержимое xml:

ruby-1.9.2-p180 :001 > response.body
 => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n  <url>\n    <loc>http://test.host/panel ... 

Моя карта сайта создается SitemapController, а представление находится в views/sitemap/index.builder.xml.

Почему не сработал have_selector?

Ответы [ 3 ]

3 голосов
/ 30 ноября 2011

Capybara не поддерживает XML-ответы. Он всегда использует Nokogiri::HTML для анализа содержимого, что приводит к неожиданным результатам при задании XML.

Добавление поддержки XML было запрошено , но было отклонено сопровождающим Capybara.

2 голосов
/ 29 ноября 2011

Используйте should have_xpath('//url') вместо. have_selector для CSS.

См. ЧАСТЬ Капибары для получения дополнительной информации.

1 голос
/ 12 декабря 2011

Насколько я могу сказать, have_selector (или have_xpath) может происходить только от Вебрата или Капибары. Вы правы в своем комментарии Джону, что вам не нужен браузерный симулятор для тестирования API.

Вы можете вызывать Вебрат или Капибару по ошибке, поскольку они используют visit вместо get AFAIK. Таким образом, переменные, с которыми они сопоставляются, возможно, никогда не были заполнены страницей, и поэтому всегда будут возвращать false.

Rails должен обрабатывать XML-документ изначально, если тип содержимого ответа правильно установлен на XML. Попробуйте использовать тестовый помощник assert_tag или assert_content в качестве базовой проверки.

Я бы просто использовал Nokogiri для анализа XHTML и запуска нормальных тестов RSpec по этому поводу:

xml = Nokogiri::XML(response.body)
xml.css("expression").size.should == 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...