модуль ActionDispatch::Assertions::TagAssertions
Пара ассертов для проверки элементов в выходном HTML ответе.
Открытые методы экземпляров
Идентично assert_tag, но утверждает, что соответствующего тега нет. (См. assert_tag для полного обсуждения синтаксиса.)
# Assert that there is not a "div" containing a "p"
assert_no_tag tag: "div", descendant: { tag: "p" }
# Assert that an unordered list is empty
assert_no_tag tag: "ul", descendant: { tag: "li" }
# Assert that there is not a "p" tag with between 1 to 3 "img" tags
# as immediate children
assert_no_tag tag: "p",
children: { count: 1..3, only: { tag: "img" } }
# File actionpack/lib/action_dispatch/testing/assertions/tag.rb, line 115
def assert_no_tag(*opts)
opts = opts.size > 1 ? opts.last.merge({ :tag => opts.first.to_s }) : opts.first
tag = find_tag(opts)
assert !tag, "expected no tag, but found tag matching #{opts.inspect} in:\n#{@response.body.inspect}"
end Утверждает, что в теле ответа есть тег/узел/элемент, удовлетворяющий всем заданным условиям. Параметр conditions должен быть хэшем с любыми из следующих ключей (все необязательны):
-
:tag: тип узла должен соответствовать соответствующему значению -
:attributes: хэш. Атрибуты узла должны соответствовать соответствующим значениям в хэше. -
:parent: хэш. Родительский узел должен соответствовать соответствующему хэшу. -
:child: хэш. По крайней мере один из непосредственных дочерних узлов должен удовлетворять критериям, описанным в хэше. -
:ancestor: хэш. По крайней мере один из предков узла должен удовлетворять критериям, описанным в хэше. -
:descendant: хэш. По крайней мере один из потомков узла должен удовлетворять критериям, описанным в хэше. -
:sibling: хэш. По крайней мере один из братьев узла должен удовлетворять критериям, описанным в хэше. -
:after: хэш. Узел должен находиться после любого брата, удовлетворяющего критериям, описанным в хэше, и по крайней мере один брат должен соответствовать. -
:before: хэш. Узел должен находиться перед любым братом, удовлетворяющим критериям, описанным в хэше, и по крайней мере один брат должен соответствовать. -
:children: хэш для подсчета дочерних узлов узла. Принимает ключи:-
:count: число или диапазон, которые должны быть равны (или включать) числу соответствующих дочерних узлов. -
:less_than: количество соответствующих дочерних узлов должно быть меньше этого числа. -
:greater_than: количество соответствующих дочерних узлов должно быть больше этого числа. -
:only: другой хэш, содержащий ключи для сопоставления с дочерними узлами, и будут учитываться только соответствующие дочерние узлы.
-
-
:content: текстовое содержимое узла должно соответствовать заданному значению. Это не будет соответствовать тегам HTML в теле тега – только текст.
Условия проверяются с помощью следующего алгоритма:
-
если условие является строкой, то оно должно быть подстрокой значения.
-
если условие является регулярным выражением, оно должно соответствовать значению.
-
если условие является числом, значение должно соответствовать number.to_s.
-
если условие является
true, значение не должно бытьnil. -
если условие является
falseилиnil, значение должно бытьnil.# Утверждение, что существует тег “span” #assert_tag тег: “span”
# Утверждение, что существует тег “span” с id=“x” #assert_tag тег: “span”, атрибуты: { id: “x” }
# Утверждение, что существует тег “span” с использованием сокращения #assert_tag :span
# Утверждение, что существует тег “span” с id=“x” с использованием сокращения #assert_tag :span, атрибуты: { id: “x” }
# Утверждение, что существует тег “span” внутри тега “div” #assert_tag тег: “span”, родитель: { тег: “div” }
# Утверждение, что существует тег “span” где-то внутри таблицы #assert_tag тег: “span”, предок: { тег: “table” }
# Утверждение, что существует тег “span” с по крайней мере одним дочерним тегом “em” #assert_tag тег: “span”, дочерний: { тег: “em” }
# Утверждение, что существует тег “span”, содержащий (возможно вложенный) тег # “strong”. #assert_tag тег: “span”, потомок: { тег: “strong” }
# Утверждение, что существует тег “span”, содержащий от 2 до 4 тегов “em” # в качестве непосредственных дочерних узлов #assert_tag тег: “span”,
children: { count: 2..4, only: { tag: "em" } }# Получить странный результат: утвердить, что существует “div” с предком “ul” # и родителем “li” (с “class” = “enum”), и содержащим потомка “span”, # текст которого соответствует /hello world/ #assert_tag тег: “div”,
ancestor: { tag: "ul" }, parent: { tag: "li", attributes: { class: "enum" } }, descendant: { tag: "span", child: /hello world/ }
Примечание: assert_tag и assert_no_tag работают только с корректным XHTML. Они распознают некоторые теги как неявно закрывающие (например, br и hr), но не будут работать правильно с тегами, допускающими необязательное закрытие (p, li, td). Вы должны явно закрывать все ваши теги, чтобы использовать эти ассерты.
# File actionpack/lib/action_dispatch/testing/assertions/tag.rb, line 96
def assert_tag(*opts)
opts = opts.size > 1 ? opts.last.merge({ :tag => opts.first.to_s }) : opts.first
tag = find_tag(opts)
assert tag, "expected tag, but no tag found matching #{opts.inspect} in:\n#{@response.body.inspect}"
end # File actionpack/lib/action_dispatch/testing/assertions/tag.rb, line 125 def find_all_tag(conditions) html_document.find_all(conditions) end
# File actionpack/lib/action_dispatch/testing/assertions/tag.rb, line 121 def find_tag(conditions) html_document.find(conditions) end
# File actionpack/lib/action_dispatch/testing/assertions/tag.rb, line 129 def html_document xml = @response.content_type =~ /xml$/ @html_document ||= HTML::Document.new(@response.body, false, xml) end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.