对于提供一些html片段(用作ajax调用)的控制器,我有一个看起来像这样的视图规范:
it "should not contain html element" do
render
rendered.should have_selector('div')
rendered.should_not have_selector('html')
end
由于我们的ajax内容加载器不允许呈现完整的html页面,我想检查结果是否不包含html标记。
现在rendered
中的结果是一个简单的div标签:
puts rendered
导致
"<div>Some text</div>"
但是,测试失败了:
Failure/Error: rendered.should_not have_selector('html')
Capybara::ExpectationNotMet:
expected not to find css "html", found 1 match: "Some text"
我也尝试了
rendered.should_not have_xpath('//html')
rendered.should_not have_css('html')
rendered.should have_no_xpath('//html')
rendered.should have_no_css('html')
但结果保持不变。
为什么检查html
是否与div
内的文字匹配?即使是body
的测试也会产生相同的结果。
答案 0 :(得分:2)
这不应该使用水豚匹配器,因为水豚使用Nokogiri :: HTML来生成内部DOM结构,这总是试图创建一个有效的HTML表示,其中还包括一个html和body标签,如果有的话没有。请参阅here in their source。
如果你想这样做,你可以分叉水豚并将那条线改成像
这样的东西native = Nokogiri::HTML::Fragment(native) if native.is_a?(String)
Nokogiri::HTML::Fragment
不会尝试增强代码以完成html结构。
另一个解决方案就是进行字符串匹配:
rendered.match('<html').should be nil
答案 1 :(得分:0)
这种检查方法怎么样? (并在断言之前抛出wait_until以确保页面正确加载)
assert_false wait_until { page.has_selector?('html')} , "Found some stuff when it shouldn't have.."
我正在使用这个顺便说一句......
gem'capybara','1.1.4'