Как использовать assert select для проверки наличия данной ссылки?
Моя страница должна содержать ссылку, которая выглядит так:<a href="/desired_path/1">Click to go</a>
.
как бы вы проверили это с помощью assert_select? Я хочу проверить наличие a
тег href="/desired_path/1"
. Как проверить атрибуты тега?
есть ли ресурсы, чтобы объяснить, как использовать assert_select? Я прочитал руководства и документацию API, но не понял этого. Есть ли какие-либо рекомендуемые лучшие способы сделать это?
Я работаю в рельсах 3 и использую встроенный тестовый фреймворк.
спасибо.
6 ответов
вы можете передать любой селектор CSS assert_select. Чтобы проверить атрибут тега, вы используете [attrname=attrvalue]
:
assert_select("a[href=/desired_path/1]") do |elements|
# Here you can test that elements.count == 1 for instance, or anything else
end
в assert_select вы также можете использовать знак вопроса для значения атрибута,а затем следовать со строкой для соответствия.
assert_select "a[href=?]", "/desired_path/1"
есть другой способ использовать assert_select, который является более дружественным, особенно если вы хотите соответствовать частичной строке или шаблону регулярного выражения:
assert_select "a", :href => /acebook\.com\/share/
вот как вы можете утверждать ряд вещей о ссылке с помощью assert_select
. 2-й аргумент может быть строкой или регулярным выражением для проверки атрибута href на:
# URL string (2nd arg) is compared to the href attribute thanks to the '?' in
# CSS selector string. Also asserts that there is only one link matching
# the arguments (:count option) and that the link has the text
# 'Your Dashboard' (:text option)
assert_select '.menu a[href=?]', 'http://test.host/dashboard',
{ :count => 1, :text => 'Your Dashboard' }
# Regular expression (2nd arg) tests the href attribute thanks to the '?' in
# the CSS selector string.
assert_select '.menu a[href=?]', /\Ahttp:\/\/test.host\/dashboard\z/,
{ :count => 1, :text => 'Your Dashboard' }
для других способов, вы можете использовать assert_select
, вот примеры, взятые из Rails actionpack 3.2.15 docs (см. файл actionpack-3.2.15/lib/action_dispatch/testing/assertions/selector.rb
):
# At least one form element
assert_select "form"
# Form element includes four input fields
assert_select "form input", 4
# Page title is "Welcome"
assert_select "title", "Welcome"
# Page title is "Welcome" and there is only one title element
assert_select "title", {:count => 1, :text => "Welcome"},
"Wrong title or more than one title element"
# Page contains no forms
assert_select "form", false, "This page must contain no forms"
# Test the content and style
assert_select "body div.header ul.menu"
# Use substitution values
assert_select "ol>li#?", /item-\d+/
# All input fields in the form have a name
assert_select "form input" do
assert_select "[name=?]", /.+/ # Not empty
end
для тех, кто использует assert_select из Rails 4.1 и обновление до Rails 4.2.
в 4.1 это работает:
my_url = "/my_results?search=hello"
my_text = "(My Results)"
assert_select 'a[href=?]', my_url, my_text
в 4.2 это дало ошибку: "предупреждение об устаревании: утверждение не было запущено из-за недопустимого селектора css. unexpected ' ('after' [: equal, " \"/my_results\""]'"
Я изменил синтаксис на это, и это сработало!:
assert_select 'a[href=?]', my_url, { text: my_text }
Eliots ответ выше помог мне, спасибо :)
вопрос конкретно спрашивает: "Как вы проверяете атрибуты [элемент]?"
другие ответы здесь использовать assert_select
способами, которые больше не работают в текущих Rails / MiniTest. Согласно этому вопрос, утверждения о содержимом атрибута теперь используют этот более Xpath-y ‘match’ синтаксис:
assert_select "a:match('href', ?)", /jm3\.net/