我想做一些基本的检查,以确保正确生成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踢?
答案 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_tag
或assert_content
测试助手作为基本检查。
我只是使用Nokogiri来解析XHTML并针对它运行正常的RSpec测试:
xml = Nokogiri::XML(response.body)
xml.css("expression").size.should == 1