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
?