【问题标题】:How to test for non existing html tag in rspec/capybara如何在 rspec/capybara 中测试不存在的 html 标签
【发布时间】:2013-05-10 14:14:15
【问题描述】:

对于提供一些 html sn-p(用作 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')

但结果保持不变。

为什么检查htmldiv内部 中的文本匹配?即使是对body 的测试也会得出相同的结果。

【问题讨论】:

  • 在测试运行时尝试puts rendered查看实际值
  • 已经这样做了,我在我的文字中提到了它(可能不够清楚):“
    Some text
    ” 最有趣的 - 如我所见 - 事实是,它在文本中找到了 html。
  • 我知道 Nokogiri 在进行任何解析之前会修复您传递给它的 html 以使其有效,其中包括将其包装到 html 标记中。我认为水豚在某种程度上做同样的事情。换句话说,should_not have_selector('html') 永远不会通过,即使您提供的初始 html 只是部分内容。
  • 谢谢!至少,在 capybara 内部,我发现 Capybara::Node::Simple 调用 Nokogiri::HTML 可能完全符合您的描述。现在想知道是否有办法通过使用不同的选择器、完全不同的方法或仅通过或指定一些参数来避免这种情况。

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


【解决方案1】:

这应该不可能使用 capybara 匹配器,因为 capybara 使用 Nokogiri::HTML 来生成内部 DOM 结构,并且它总是试图创建一个有效的 HTML 表示,它还包括一个 html 和 body 标记,如果有没有。见here in their source

如果你想这样做,你可以分叉 capybara 并将该行更改为类似

native = Nokogiri::HTML::Fragment(native) if native.is_a?(String)

Nokogiri::HTML::Fragment 不会尝试增强代码以获得完整的 html 结构。

另一种解决方案是简单地进行字符串匹配:

rendered.match('<html').should be nil

【讨论】:

  • 我喜欢字符串匹配的想法,您可以将渲染的字符串加载到 Nokogiri 片段中以使用精美的 css 选择器。
  • 是的——我在代码中找到了它,并在上面的评论中提到了它。目前我正在匹配你提到的东西,但它不是 100%……只是为了完整性和理解我会尝试片段。感谢您的帮助和分享见解。
【解决方案2】:

这种检查方式怎么样? (并在你断言之前抛出一个 wait_until 以确保页面正确加载)

assert_false wait_until { page.has_selector?('html')} , "Found some stuff when it shouldn't have.."

我正在使用这个顺便说一句...

宝石'水豚','1.1.4'

【讨论】:

  • 我明天可以测试您的建议,但我不明白为什么这会有所帮助。我将检查文档中的 wait_until。但是,我的问题是该页面不包含并且永远不会包含 标记,但是针对此行为的确切测试失败。
  • 它根本不起作用。无论我是否在模板中添加或不添加 html 标签,您的测试总是通过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多