Как протестировать XML файл с помощью RSpec?

У меня есть RSS-канал, который я пишу для теста RSpec. Я хочу проверить, что XML-документ имеет правильные узлы и структуру. К сожалению, я не могу найти хороших примеров того, как это сделать чистым способом. Я нашел только несколько реализованных решений и устаревшие сообщения в блогах. Как проверить структуру документа 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, и когда вы запускаете тест, он проверяет, чтобы полученная полезная нагрузка соответствовала ожидаемому (утвержденному ) полезная нагрузка, которую пройдет тест, если он соответствует другому, тест не работает