【问题标题】:Test for consecutive HTML elements in Rails view在 Rails 视图中测试连续的 HTML 元素
【发布时间】:2020-11-19 10:10:59
【问题描述】:

我希望运行一个测试*来检查是否存在这样的东西:

<tr>
    <td> name </td> <td> date </td>
</tr>

代码,如下:

assert_select "tr" do
  assert_select "td",  name
  assert_select "td",  date
end

看起来有道理,但不正确,例如下面的例子(这不是所需的匹配)也会通过:

<tr>
    <td> name </td>
</tr>
<tr>
    <td> date </td>
</tr>

我很难从assert_select 的文档中了解如何解决这个问题。

谢谢

丹尼尔

  • 在默认的 Rails 集成测试中(我相信这意味着 MiniTest)

【问题讨论】:

  • CSS 确实有一个兄弟选择器 td+td,但它没有基于文本节点的选择器。除非您可以添加类或数据属性,否则您最好的选择可能是使用assert_select 'td', exp,其中exp 是匹配节点的正则表达式。您也可以使用css_select 选择 td 元素并遍历它们。如果它的行为类似于可枚举,您应该能够使用 with_index 与集合中的前一个项目进行比较。
  • 感谢@max 正确方向的指点。对于信息,兄弟选择器不会返回第一个 td(在此上下文中),仅返回后续兄弟。 css_select 返回类 Nokogiri::XML::NodeSet 的东西,它响应 each_with_index。

标签: ruby-on-rails testing minitest


【解决方案1】:

我最终在 css_select 的结果上使用了正则表达式,这看起来有点不雅,但对我的目的有用。如果有更好的方法,我很想听听。我用过这样的东西:

pars = css_select "tr"
regexs = /<td>#{name}<\/td>.*<td>#{date}<\/td>/m
match = false
pars.each { |i| if i.to_s =~ regexs then match = true end}
assert match  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2020-09-08
    • 1970-01-01
    相关资源
    最近更新 更多