【第21週】パRails輪読会🚂 (2024-01-09~ 2024-01-12)

tags: パRails🚂

目次


2024-01-09(火)

ファシリ

@sadanora

ドライバー

@sharoa

読んだところ

7-5 「コントローラに対する機能テスト」から
7-5-2「起動確認APIのテスト」まで。
PR:https://github.com/PerfectRubyonRails-Rindoku/Perfect_Ruby_on_Rails_Ch6/pull/21

次回

7-5-3 「ログインヘルパーを機能テストでも利用可能にする」から。🚂

学んだこと・感想

  • @sharoa

    • 久しぶりのドライバーは緊張した。そして、何も動いていない時に画面が落ちたタイミングで画面共有が切れるんだな、と知った。(改めて思いなおすとそりゃそうかって感じですw)
    • コントローラに対する機能テストはHTTPメソッドGETに加えて、 POST、UPDATE、DELETEなどでアクセスするテストを明示して簡単に書くことができる。
    • GET以外のHTTPメソッドでのリクエストを直接することができない、ブラウザを動作させるためにテスト実行に時間がかかる、この2つのケースはシステムテストでは都合が悪いとのこと。
    • でも、これらの問題を解決するには機能テストを利用すればいい。
    • コントローラに対する機能テストはビューもrack middlewareも実行する。これはインテグレーションテストも同じ。(インテグレーションテストは機能テストと似たテストで、複数のリクエストにまたがるテストを書くためのもの。)
  • @moegi29

    • システムテスト:Railsアプリの動作をテストするテスト、機能テスト:JSONを返すようなAPIに対してのテスト、インテグレーションテスト:機能テストと似ている、複数のリクエストにまたがるテストを書くためのもの。それぞれ特徴がある。
    • RackはRubyでWebアプリを作るときの標準仕様、Rackミドルウェアについても137ページに書いてありました。すっかり忘れていたので読み返しておきたいと思います。
  • @ayu-0505

    • API(アプリケーション・プログラミング・インターフェース)という単語のイメージが難しいです。
    • rack middlewareもsinatraあたりでふわっと触ったきりで忘れかけているので復習しておきます。(Webサーバー??)
    • MIMEタイプとはレスポンスにおけるデータ種類の情報のこと。
  • @shodan

    • MIMEタイプはHTTPヘッダのContent-Typeで伝達されるもの。レスポンスにおいてはクライアントに返されたコンテンツの実際の種類を伝える。
    • リクエストにおいては (POST または PUT などで)、クライアントがサーバーに実際に送ったデータの種類を伝える。
    • コントローラテストとインテグレーションテストのテストクラスは、同じActionDispatch::IntegrationTestを継承している。
      • 同じテストクラスを継承したクラスなので、できることは同じ。別の名前のテストですが同じクラスを継承していることを知らなかった(思いもしなかった)ので勉強になりました。
      • そもそも、コントローラのテストをプラクティスでも書かなかったので、触れる機会が少なかったかもです。
    • テストによってrackを通る、通らないというのがあるというのも知見でした。そもそもrackが担当している処理ってなんだっけ〜という感じだったので、また読み直ししてみようかな〜と思います。
  • @motohiro-mm

    • Railsのテストのプラクティスで、コントローラに対する機能テストはやっていなかったので、今日は本当によくわかりませんでした
      • tadaさんに説明していただいてやっと少しわかった気がします
    • Webリクエストが成功したか、正しいページにリダイレクトされたか、ユーザ認証が成功したか、ビューに表示されたメッセージは適切か
    • インテグレーションテスト:複数のリクエストにまたがるテストを書くためのもの
    • MIME:まいむ
  • @sadanora

    • システムテストとコントローラテストは近いことをテストできるけど、微妙にできることが違うので使い分けられるとよさそう。
    • 最近はコントローラテストは書かない、てどこかで聞いた気がするけどどうなんだろう?
  • @hiromisugie

    • RSpecではテストのことを「スペック」と呼んでる、という感じ?コントローラスペック、リクエストスペック、システムスペック、など。
    • システムテスト、機能テスト、インテグレーションテスト、などの名称はminitestとしての言い方ってコト?→minitest用語ってよりは、一般的な言い方。
    • RSpecのコントローラスペックは、minitestのコントローラに対する機能テストと違ってrack middlewareを通らない。紛らわしいという感想しかないが、慣れたい。
    • MIMEの読み方はマイムMultipurpose Internet Mail Extensionsの略。
    • https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types
    • application/jsonのようにタイプ/サブタイプの2つで構成される
    • APIは、JSONを返してくれるやつ。理解がフワッとし過ぎている…!
      • 「RailsのAPIモード」とか、「あのWebサービスはAPIを提供しているから便利」とか、言葉としてはめちゃくちゃ聞くけど、「JSONを返してくれるからフロント側はReactでもなんでもこちらで自由に組み立てられる」ってことかと、フワッとした理解を進めております
      • 昨今はJSONが多いので大体OKだけど、必ずしもJSONを返すもの、というわけではない。
    • 余談ですがMacの充電について、最近はMac側でバッテリー劣化を防ぐために「充電保留」ってのがあるらしいです
      https://support.apple.com/ja-jp/guide/mac-help/mchlbfb7e12a/mac

2024-01-10(水)

ファシリ

@sharoa

ドライバー

@hiromisugie

読んだところ

7-5-3 「ログインヘルパーを機能テストでも利用可能にする」から
7-5-4 「他の人が作ったイベントを削除できないことを確認するテスト」まで。
PR:https://github.com/PerfectRubyonRails-Rindoku/Perfect_Ruby_on_Rails_Ch6/pull/22

次回

7-6 「モデルに対するテスト」から。🚂

学んだこと・感想

  • @sharoa

    • ログインヘルパーを機能テストでも利用可能にするにはcaseを使う。
    • そして、SignInHelpaerモジュールを機能テスト・インテグレーションテストの継承元クラスにインクルードして利用可能できるようにしている。
    • ここのコードの読み解きが難しかった。英語の意味でなんとなくそうだろう、とは思ってもめちゃくちゃふわっとした感じしかなかったので、最初みんなであれやこれやと考えるのも久しぶりで楽しかったですし、その後のshodanさんの説明でスッキリすることができてよかった。
  • @moegi29

    • ログインヘルパーを機能テストとインテグレーションテスト、両方でテストするにはcaseを使って切り分ける必要がある。
    • when respond_to?(:visit)はシステムテスト、when respond_to?(:get)は機能テストの部分。どれでもなかったらraiseメソッドを使ってエラーを発生させる。shodanさんがしてくださった解説でなんとか理解できました、類推力すばらしい
  • @ayu-0505

    • ログインヘルパーを機能テストでも利用可能にするために、case ~ whenを用いて、テスト種類ごとに異なるメソッドを使用したログインを行う。
      • respond_to?(:method)でレシーバが対象のメソッドを持っているかの真偽値を返す。
      • システムテストの場合はvisitメソッドを持っているため、true
      • 機能テストの場合はgetメソッドを持っているため、true
    • assert_difference(ブロック内処理を行った際の違いを検証)メソッドのブロック内で、さらにassert_raises(エラーが期待通りのものか検証)メソッドを使用し、ブロックを使っている。
    • assertを2重で使うのはすぐには理解しづらいので慣れていきたい。
  • @shodan

    • たぶん考え方としてこういうことなのかも、と思いました。
      • これまでのsign_in_asメソッドだと、機能テストでログインができない(機能テストで流用できないので、修正しよう)
      • システムテストと機能テストで、ログインの時の操作を分岐させる必要がある。違うところを見つけよう
      • システムテストのクラスのオブジェクトはvisitメソッドを持っている
      • 機能テストのクラスのオブジェクトはgetメソッドを持っている
      • ↑ここで分岐させよう。あるオブジェクトが「そのメソッドを持っているか?」ということは、Rubyのrespond_to?メソッドでわかる
      • その結果でcasewhen分岐させよう
  • @hiromisugie

    • ログインヘルパーへの追記のところが難しかった…。システムテストではvisitしたりclick_onしてログインするけど、機能テストの場合は画面遷移とかできるわけではないのでgetメソッドを使う、という感じ?
    • 「自分が作ったイベントは削除可能」であることを確認するには、「自分が作ったイベントを削除できるテスト」と「他の人が作ったイベントは削除できないテスト」の両方が必要。前者だけ確認して満足してしまいそうなので気を付ける。
  • @motohiro-mm

    • ログインヘルパーをシステムテストと機能テストで共用できる
      • 今回は、受け取るオブジェクト?をrespond_to?で判断してcase~whenで場合分けしている
    • 権限に関する仕様はテストを書いて確認しておくこと、バグがあると大きな問題になる
      • 今回は、「自分が作ったイベントは削除可能」、「他の人が作ったイベントは削除できない」をテストしている
    • assert_raisesはエラーがあってるか確認している

2024-01-12(金)

ファシリ

@sharoa

ドライバー

@ayu-0505

読んだところ

7-6 「モデルに対するテスト」から
7-6-3 「モックを使ってテストする」まで。
PR: https://github.com/PerfectRubyonRails-Rindoku/Perfect_Ruby_on_Rails_Ch6/pull/23

次回

7-6-4 「バリデーションをテストする」から。🚂

学んだこと・感想

  • @sharoa

    • モデルに対するテストは、以下のような項目をテストできる
        - 各メソッドが期待通りの値を返すか
        - 各メソッドが期待通りの副作用をもたらしているか
        - バリデーションが正しく設定されているか
    • 直接のテスト対象ではないモデルのオブジェクトはダブルで置き換えることができる。ダブルとはオブジェクトの代わりをするオブジェクトのことで、スタブやモックなどがある。
  • @hiromisugie

    • ダブルとは、オブジェクトの代わりをするオブジェクト。
      • スタブ:既存メソッドの戻り値を一時的に差し替えることができる。
      • モック:スタブの機能に加えて、そのメソッドが呼び出されたかどうかを確認できる。
    • 上記どちらも、require minitest/mockすることで使えるようになる
    • モックは「そのメソッドが呼び出されたかどうかを確認できる」ことと、それを確認するためにテストでuser.verifyしているということはわかったが、メソッドが呼び出されることの意味がちょっとわかってない…。
    • 書籍p376のMiniTest::Mockは誤植で、Minitest::Mockが正しい!
  • @shodan

    • ダブルについて
      • ダブルとは、オブジェクトの代わりをするオブジェクト
      • Eventモデルのテストに本物のUserオブジェクトを使うと、Userオブジェクトの実装が変わったときに、純粋にEventテストの問題だけに切り分けてテストをするのが難しくなる
        • この2つの関係は「依存度が高い」
        • 依存度が低いことは「疎」である
      • ダブルには「スタブ」と「モック」がある
      • 今回使ったスタブは、既存メソッドの戻り値を指定の値に一時的に差し替えたオブジェクトのこと
      • require minitest/mockを読み込むことで、モデルオブジェクト.stub(:カラム名, 差し替えたい値) do テストしたい処理 endという形でスタブを使うことができる
      • モックは↑に加え、モックオブジェクトのメソッドが呼び出されたどうかをverifyメソッドを使うことで確認することができる
  • @moegi29

    • test '#created_by? 引数がnilな時' doは「userが退会したときにeventがnullになる」ことをテストしている。dependent :: nullfyと紐づいてることをすっかり忘れていたのでP.341の退会処理の部分をもういちど読んでおきたい
    • ダブル:オブジェクトの代わりをするオブジェクト。モック化:本物のオブジェクトのふりをするオブジェクトのこと。スタブ:オブジェクトのメソッドを上書きして、事前に返して欲しい値を設定することができる。
    • ×MiniTest 〇Minitest
  • @motohiro-mm

    • userがnilってどういう状況かわかっていなかったけど、退会したユーザーだった
    • ダブル:オブジェクトの代わりをするオブジェクト
      • スタブ:メソッドの戻り値を変更することができる。外部からの入力
      • モック:メソッドの戻り値を変更することに加えて、そのメソッドが呼び出されたかどうか確認できる。外部への出力
      • スタブとモックの違い使い分けがいまいちわかっていません…
  • @ayu-0505

    • テストダブルとは、テストにおいて対象以外のコードを別の模倣品に置き換えるためのオブジェクトのこと。
    • スタブとモックはどちらもその代替オブジェクトだが、役割が少し異なる
      • スタブ テスト対象におけるコード内で、外部クラスやオブジェクトを置き換えることで、テスト対象だけをテストするように注目度をあげる。
      • モック 出力を受け取ってそれ自体がチェック機能を持つ。(なので最後user.verifyでモックであるuserが自分で検証することができる)

Select a repo