如何在rspec / capybara中测试不存在的html标记

时间:2013-05-10 14:14:15

标签: ruby-on-rails-3 capybara rspec-rails

对于提供一些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的测试也会产生相同的结果。

2 个答案:

答案 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'