У меня есть RSS-канал, который я пишу для теста RSpec. Я хочу проверить, что XML-документ имеет правильные узлы и структуру. К сожалению, я не могу найти хороших примеров того, как это сделать чистым способом. Я нашел только несколько реализованных решений и устаревшие сообщения в блогах. Как проверить структуру документа XML с помощью RSpec?
Как протестировать XML файл с помощью RSpec?
Ответ 1
Привет, я могу порекомендовать вам использовать пользовательский сопоставитель для этого.
require 'nokogiri'
RSpec::Matchers.define :have_xml do |xpath, text|
match do |body|
doc = Nokogiri::XML::Document.parse(body)
nodes = doc.xpath(xpath)
nodes.empty?.should be_false
if text
nodes.each do |node|
node.content.should == text
end
end
true
end
failure_message_for_should do |body|
"expected to find xml tag #{xpath} in:\n#{body}"
end
failure_message_for_should_not do |response|
"expected not to find xml tag #{xpath} in:\n#{body}"
end
description do
"have xml tag #{xpath}"
end
end
Полный пример можно найти здесь https://gist.github.com/Fivell/8025849
Ответ 2
Больше не нужно откатывать свои собственные. Мы ежедневно решаем эту проблему, используя эквивалент-xml в https://github.com/mbklein/equivalent-xml.
require 'rspec/matchers'
require 'equivalent-xml'
...
expect(node_1).to be_equivalent_to(node_2)
Имеются варианты для краевых случаев, таких как сохранение пробелов.
Другой вариант - использовать формальный шаблон XSD для строгой проверки.
Ответ 3
context 'POST #join' do
it 'does successfully hit join xml route' do
post :join,
format: :xml
response.content_type.should == "application/xml"
response.should be_ok
end
end
Это сработало для меня. Я не понимал, что должен пройти формат:: xml. Мой маршрут соединения отвечает на /join.xml, и я тестировал, что это было успешным.
Ответ 4
Дайте Approvals попробовать, он работает с rspec, я использовал для тестирования полезной нагрузки Json, и он используется с Minitest в exercism.io
ИЗМЕНИТЬ
it "returns available traffic information around me" do
post '/search_traffic_around', {location: [-87.688219, 41.941149]}.to_json
output = last_response.body
options = {format: :json, name: 'traffic_around_location'}
Approvals.verify(output,options)
end
JSON, с которым я проверяю, находится в папке spec/fixtures
с именем traffic_around_location.approved.json
Реализация, в которой извлечен вышеприведенный фрагмент, доступна здесь
Как это работает, вы поставляете ожидаемую полезную нагрузку, JSON, XML, TXT и HTML, я уверен, что он поддерживает в spec/fixtures
, и когда вы запускаете тест, он проверяет, чтобы полученная полезная нагрузка соответствовала ожидаемому (утвержденному ) полезная нагрузка, которую пройдет тест, если он соответствует другому, тест не работает