Ruby 如何使用RSpec测试XML文件?
我有一个RSS提要,我正在为它编写RSpec测试。我想测试XML文档是否具有正确的节点和结构。不幸的是,我找不到任何好的例子来说明如何以干净的方式做到这一点。我只发现了一些半实现的解决方案和过时的博客文章。如何使用RSpec测试XML文档的结构?试一试,它与RSpec一起工作,我曾用于测试Json负载,并且在中与Minitest一起使用 编辑 我正在验证的JSON位于名为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文件夹中 从中提
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