API中有关assert_select这块读着有些呦口,于是给翻了出来:
assert_select(selector, equality?, message?)
assert_select(element, selector, equality?, message?)
此断言可以选择元素,进行一个或多个相等测试。
如果第一个参数为元素,则选择所有相匹配的元素:以此元素开始(包括此元素)以及它的所有深度优先子节点元素。
如果没有指定元素,并且assert_select也没有在assert_select块内被调用,调用assert_select时元素来自于响应的HTML。
当在assert_select块内被调用时,则以数组的形式将元素传递到块内。在块内调用assert_select,并且没有为它指定元素,则块内assert_select进行断言测试时使用的元素为assert_select块所选择的元素。数组中的每个元素可以分别被assert_select所使用。
如果响应中包含两个顺序列表(ol),而每个顺序列表又包含四个列表元素(li),那么:
assert_select "ol" do |elements|
elements.each do |element|
assert_select element, "li", 4
end
end
测试,正如你想的那样:
assert_select "ol" do
assert_select "li", 8
end
选择器可以是CSS选择器表达式(或字符串),带替换值的表达式或者是HTML::Selector对象。
相等测试
相等测试可以是以下其中之一:
* true - 如果至少有一个元素被选择,那么此断言为真。
* false - 如果没有元素被选择,那么此断言为真。
* String/Regexp - 如果至少一个元素的文本值与此字符串或正则表达式相匹配,那么此断言为真。
* Integer - 如果被选择的元素的个数与这个整数相等,那么此断言为真。
* Range - 如果被选择的元素的个数符合这个排列,那么此断言为真。
如果没有指定相等测试,那么当至少有一个元素被选择时,此断言为真。
为了执行多个相等测试,可以使用带有以下键的哈希:
* :text - 加上条件以缩小被选择元素的范围,条件为元素内的文本(字符串或正则表达式)含有:text对应的值。
* :html - 加上条件以缩小被选择元素的范围,条件为元素内的HTML内容(字符串或正则表达式)含有:html对应的值。
* :count - 如果被选择元素的个数等于:count对应的值,那么些断言为真。
* :minimum - 如果被选择元素的个数至少等于:count对应的值,那么些断言为真。
* :maximum - 如果被选择元素的个数最多等于:count对应的值,那么些断言为真。
如果此方法调用时使用块,一旦所有相等测试执行完毕,所有匹配元素所组成的数组将被此方法调用。
示例:
# 断定至少有一个form元素
assert_select "form"
# Form元素包含四个input
assert_select "form input", 4
# 页面的title是"Welcome"
assert_select "title", "Welcome"
# 页面的title是"Welcome" 并且页面当中只有一个title元素
assert_select "title", {:count=>1, :text=>"Welcome"}, "Wrong title or more than one title element"
# 页面不包含form元素
assert_select "form", false, "This page must contain no forms"
# 测试内容和样式
assert_select "body div.header ul.menu"
# 使用替代值
assert_select "ol>li#?", /item-\d+/
# form中的所有input元素都有name属性
assert_select "form input" do
assert_select "[name=?]", /.+/ # Not empty
end