你如何使用rspec has_selector方法来验证XML?

时间:2011-11-29 10:04:59

标签: ruby-on-rails xml rspec

我想做一些基本的检查,以确保正确生成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 个答案:

答案 0 :(得分:3)

Capybara不支持XML响应。它始终使用Nokogiri::HTML来解析内容,这在给定XML时会产生意外结果。

添加XML支持已been requested但被Capybara的维护者拒绝。

答案 1 :(得分:2)

请改用should have_xpath('//url')have_selector适用于CSS。

有关详细信息,请参阅the Capybara README

答案 2 :(得分:1)

据我所知,have_selector(或have_xpath)只能来自Webrat或Capybara。您对John的评论是正确的,您不需要使用浏览器模拟器来测试API。

您可能会错误地调用Webrat或Capybara,因为他们使用的是visit而不是get AFAIK。因此,它们匹配的变量可能永远不会被页面填充,因此将始终返回false。

如果响应内容类型正确设置为XML,Rails应本机处理XML文档。尝试使用assert_tagassert_content测试助手作为基本检查。

我只是使用Nokogiri来解析XHTML并针对它运行正常的RSpec测试:

xml = Nokogiri::XML(response.body)
xml.css("expression").size.should == 1