assert_selectの第2引数に注意!(Rails 6.0.0)


結論 文字列を渡すか数字を渡すかでテスト条件が変化する

文字列を渡した場合は指定した要素の内容を検証する

users_profile_test.rb
test "profile display" do
  assert_select 'strong#following', "2"
end
_stats.html.erb
<!--テストがパスするパーシャル-->
<strong id="following" class="stats"> 2 </strong>

数字を渡した場合は指定した要素の個数を検証する

users_profile_test.rb
test "profile display" do
  assert_select 'strong#following', 2
end
_stats.html.erb
<!--テストがパスするパーシャル-->
<strong id="following" class="stats"> 2 </strong>
<strong id="following" class="stats"> 2 </strong>

参考情報

Railsガイドによると、assert_selectには2つの書式があります。

assert_select(セレクタ, [条件], [メッセージ])という書式は、セレクタで指定された要素が条件に一致することを主張します。セレクタにはCSSセレクタの式 (文字列) や代入値を持つ式を使えます。

assert_select(要素, セレクタ, [条件], [メッセージ]) は、選択されたすべての要素が条件に一致することを主張します。選択される要素は、element (Nokogiri::XML::Node or Nokogiri::XML::NodeSetのインスタンス) からその子孫要素までの範囲から選択されます。

推測ですが、第2引数に文字列を渡した場合は
・第1引数=要素
・第2引数=メッセージ
と判断され、数字を渡した場合は
・第1引数=要素
・第2引数=条件
と判断されると思われます。

上記を踏まえると、以下2つは同じ条件であると考えられます。

assert_select 'strong#following', 2
assert_select 'strong#following', count: 2

数字を渡すと自動的に条件であると判断されてしまうということですね。

要素の内容の数字を検証したい場合は第2引数を
・ダブルクオートまたはシングルクオートで囲って文字列化
・ダブルクオートで囲って式展開する
必要があると考えられます。

これに気づくのに半日かかりました...

あとがき

現在Ruby on Railsチュートリアルで学習中の初学者・タツロンです。
今回は14章 14.2.2~14.2.3を学習中につまづき、検証して気がついた事について投稿させていただきました。
間違っている点やアドバイス等ございましたらコメント頂けば幸いです。

参考:Rails テスティングガイド