web-dev-qa-db-ja.com

assert_selectを使用して特定のリンクの存在をテストする方法は?

私のページには、<a href="/desired_path/1">Click to go</a>のようなリンクが含まれている必要があります。

Assert_selectを使用してそれをどのようにテストしますか? href="/desired_path/1"aタグの存在を確認したい。タグの属性をどのようにテストしますか?

Assert_selectの使い方を説明するリソースはありますか?ガイドとAPIドキュメントを読みましたが、わかりませんでした。これを行うための推奨されるより良い方法はありますか?

私はRails 3で作業しており、組み込みのテストフレームワークを使用しています。

ありがとう。

31
B Seven

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
16
Blacksad

Assert_selectでは、属性値に疑問符を使用し、その後に一致する文字列を続けることもできます。

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

特に部分的な文字列または正規表現パターンに一致させたい場合は、より使いやすいassert_selectを使用する別の方法があります。

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

29
Chris Houhoulis

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
19
Eliot Sykes

具体的には、「[要素]の属性をどのようにテストしますか?」という質問です。

ここでの他の回答は、現在のRails/MiniTestで機能しなくなった方法でassert_selectを使用します。これに従って issue 、属性の内容に関するアサーションはこれを使用しますより多くのXpath-y 'match'構文:

assert_select "a:match('href', ?)", /jm3\.net/
3
jm3

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セレクターのため、アサーションは実行されませんでした。予期しない '('の後に '[:equal、 "\"/my_results\""]'」

私は構文をこれに変更し、うまくいきました!:

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

上記のエリオットの答えは私を助けました、ありがとう:)

2
Richard
assert_select 'a' do |link|
  expect(link.attr('href').to_s).to eq expected_url
end
1
Sujoy Gupta