92834


Railsチュートリアル第13章の[ユーザーのマイクロポスト](https://railstutorial.jp/chapters/user_microposts?version=5.1#cha-
user_microposts)について。

[リスト 13.28:
Userプロフィール画面に対するテスト](https://railstutorial.jp/chapters/user_microposts?version=5.1#code-
user_profile_test)の`assert_match @user.microposts.count.to_s,
response.body`は、[リスト 13.24: マイクロポストをユーザーのshowページ (プロフィール画面)
に追加する](https://railstutorial.jp/chapters/user_microposts?version=5.1#code-
user_show_microposts)の`<h3>Microposts (<%= @user.microposts.count
%>)</h3>`をテストしていると思われるのですが、後者のコードをコメントアウトしてもテスト結果はGREENのままです。前者のコードはどこのコードをテストしているのでしょうか？

試しに、テストコードを`assert_match "Microposts (#{@user.microposts.count})",
response.body`に変更し、コメントアウトするとテスト結果はREDになりました。戻すとGREENになります。

テスト対象はどこかと、2つのテストコードの違いが分かりません。よろしくお願いします。


CC BY-SA 4.0
2022-12-17T03:13:57.690
92826
2022-12-17T17:11:07.340
56037
question
ruby-on-rails ruby
Rails Tutorial 第13章 テストコードがどこをテストしているのかが分からない


このテストケースでテストしたいのは、質問者さんのおっしゃるように `Microposts (件数)`
の部分でちゃんと件数を出せていることなのだろうと推測します。一方で今回のテストコードだとテストしたい条件を満たしていなくてもうっかりテストが通ってしまう可能性が大きくなっています。

`assert_match` を使った場合、与えられた文字列（今回だと
`response.body`）の中のどこでも良いのでその文字列が存在していればテストが通ります。このためたとえば
`@user.microposts.count.to_s` が `"1"` だった場合、どこでも良いので `"1"`
という数字が含まれていればテストが通ることになります。今回 HTML の内容すべてに対してマッチするか見ているので、たとえば <h1> の 1
にもマッチします。

このようにテストしたいものの条件の記述が甘く、うまくテストしきれないことはよくあります。条件をぴったりちょうど示すテストコードを書くのが難しい場合は多々あるため、どういったコードで良しとするかは実装者次第な側面があります。

より上手くテストをするための工夫はいくつかあります。今回の場合ですと、質問者さんが既に試されたようにより長い文字列でのマッチを確かめるという方法もありますし、`assert_select`
と組み合わせて特定のタグの下に特定の文字列があることを確かめるようにするという方法もあります。Rails
標準の機能ではありませんがスナップショットテストというのも有名です。Rails 標準の機能について詳しくは Rails
ガイドのテスティングガイドをご覧ください:
<https://railsguides.jp/testing.html#%E3%83%93%E3%83%A5%E3%83%BC%E3%82%92%E3%83%86%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B>


CC BY-SA 4.0
2022-12-17T08:35:44.097
92834
2022-12-17T08:35:44.097
19110
92826
answer


チュートリアルの説明がそのまま答えになりそうですね

ーーーー

[![画像の説明をここに入力](https://i.stack.imgur.com/XSEYL.png)](https://i.stack.imgur.com/XSEYL.png)


CC BY-SA 4.0
2022-12-17T09:20:26.870
92836
2022-12-17T09:20:26.870
15380
92826
answer


先ほどページのソースを確認してみたところ、アセットファイル名のダイジェストの一部に`@user.microposts.count.to_s`と同じ数字(自分の場合は`"34"`)が含まれていました。  
質問に対するアンサーおよび解決方法は、他の回答者さまのとおりです。


CC BY-SA 4.0
2022-12-17T17:11:07.340
92852
2022-12-17T17:11:07.340
56037
92826
answer