assert_select和css_select有什么区别?

时间:2014-07-17 17:48:30

标签: ruby-on-rails

我正在解决在某些图片上混合协议的网络应用上的错误。我想要做的是选择所有图像进行测试检查,看看我的逻辑代码是否将协议转换为适当的http / https。我遇到了这两种用于rails的辅助方法,但我并没有完全不同。他们基本上似乎在做同样的事情。

我想要做的就是从我的网页中选择所有图片,然后确保看到他们有http或https。

我应该这样做:

assert_select("img") do |attachments|
  assert_match /http:/, attachments
end

css_select("a img").each do |attachments|
  assert_match /http:/, attachments
end

有什么想法?我何时应该使用另一个?

1 个答案:

答案 0 :(得分:1)

css_select不接受&block,只接受*argssee documentation

  

css_select(* args)public

引用文档:

  

选择并返回所有匹配的元素。


assert_select接受&block作为参数(see documentation):

  

assert_select(* args,& block)public

&block参数是可选的。引用有关&block部分的文档:

  

使用块assert_select调用时,会将所选元素的数组传递给块。从块中调用assert_select,未指定任何元素,在封闭断言选择的完整元素集上运行断言。或者,可以迭代数组,以便可以为每个元素单独调用assert_select


换句话说assert_select允许您执行嵌套assert_select

assert_select "ol" do |elements| # example from doc
  elements.each do |element|
    assert_select element, "li", 4
  end
end

css_select无法嵌套:

# this is an equivalent of the example above
assert (css_select('ol>li').size == 4), 'There is not 4 <li> inside the <ol> !'