Как использовать assert_select для проверки наличия данной ссылки? - PullRequest
29 голосов
/ 17 августа 2011

Моя страница должна содержать ссылку, которая выглядит как <a href="/desired_path/1">Click to go</a>.

Как бы вы протестировали это с помощью assert_select?Я хочу проверить наличие тега a с href="/desired_path/1".Как вы проверяете атрибуты тега?

Есть ли какие-либо ресурсы, чтобы объяснить, как использовать assert_select?Я прочитал Руководства и документацию по API, но не понял этого.Есть ли какие-либо рекомендуемые более эффективные способы сделать это?

Я работаю в Rails 3 и использую встроенный тестовый фреймворк.

Спасибо.

Ответы [ 6 ]

27 голосов
/ 28 июня 2012

В assert_select вы также можете использовать вопросительный знак для значения атрибута, а затем следовать строку для соответствия.

assert_select "a[href=?]", "/desired_path/1"

Существует еще один способ использования assert_select, которыйболее дружественный, особенно если вы хотите сопоставить частичную строку или шаблон регулярного выражения:

assert_select "a", :href => /acebook\.com\/share/

17 голосов
/ 18 ноября 2013

Вот как вы можете утверждать несколько вещей о ссылке, используя 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 (см. Файл 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
16 голосов
/ 18 августа 2011

Вы можете передать любой селектор 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
2 голосов
/ 23 января 2018

В частности, задается вопрос: «Как вы тестируете атрибуты [элемента]?»

Другие ответы здесь используют assert_select способами, которые больше не работают в текущем Rails / MiniTest.Согласно этой проблеме , утверждения о содержимом атрибута теперь используют этот синтаксис Xpath-y 'match':

assert_select "a:match('href', ?)", /jm3\.net/
2 голосов
/ 28 августа 2015

Для всех, кто использует 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. непредвиденный '(' после '[: равный, "\" / my_results \ ""]' "

Я изменил синтаксис на это, и он работал!:

assert_select 'a[href=?]', my_url, { text: my_text }

Ответ Элиота выше помог мне, спасибо:)

1 голос
/ 03 августа 2016
assert_select 'a' do |link|
  expect(link.attr('href').to_s).to eq expected_url
end
...