Ruby 如何使用RSpec测试XML文件?

Ruby 如何使用RSpec测试XML文件?,ruby,xml,rspec,rss,Ruby,Xml,Rspec,Rss,我有一个RSS提要,我正在为它编写RSpec测试。我想测试XML文档是否具有正确的节点和结构。不幸的是,我找不到任何好的例子来说明如何以干净的方式做到这一点。我只发现了一些半实现的解决方案和过时的博客文章。如何使用RSpec测试XML文档的结构?试一试,它与RSpec一起工作,我曾用于测试Json负载,并且在中与Minitest一起使用 编辑 我正在验证的JSON位于名为traffic\u around\u location.approved.JSON的spec/fixtures文件夹中 从中提

我有一个RSS提要,我正在为它编写RSpec测试。我想测试XML文档是否具有正确的节点和结构。不幸的是,我找不到任何好的例子来说明如何以干净的方式做到这一点。我只发现了一些半实现的解决方案和过时的博客文章。如何使用RSpec测试XML文档的结构?

试一试,它与RSpec一起工作,我曾用于测试Json负载,并且在中与Minitest一起使用

编辑 我正在验证的JSON位于名为
traffic\u around\u location.approved.JSON的
spec/fixtures
文件夹中

从中提取上述代码段的实现是可用的


它的工作原理是您向它提供一个预期的负载、JSON、XML、TXT和HTML。我确信它在
spec/fixtures
中支持这一点,并且当您运行测试时,它会检查以确认收到的负载与预期的(已批准)匹配有效负载如果与其他测试匹配,则测试将通过。测试失败。嗨,我建议您为此使用自定义匹配器

 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
完整的例子可以在这里找到

您不再需要自己滚动。我们每天都在使用等效的xml匹配器处理这个问题

对边缘情况有选项,如保留空白

另一种选择是使用正式的XSD模板进行严格验证

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

这对我有用。我没有意识到我必须通过format::xml。我的加入路由响应/join.xml,我正在测试这是否成功

你能举个例子说明这是如何使用的吗?我已经阅读了批准自述文件,它不是很清楚。我会给你一个更新答案的赞成票,但我仍然希望看到一些替代方案(或者至少更多的赞成票表明这是一个流行的解决方案)。这并不能真正解决OP的问题,但是,我可以断言,在不添加gems的情况下获取xml是很有帮助的
require 'rspec/matchers'
require 'equivalent-xml'
...
expect(node_1).to be_equivalent_to(node_2)
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