【第20週】パRails輪読会🚂 (2024-01-04~ 2024-01-05)

tags: パRails🚂

目次


2024-01-04(木)

ファシリ

@shodan

ドライバー

@motohiro-mm

読んだところ

7-4-3 「システムテストを失敗させる」から
7-4-6 「ログインが必要なページのテストを書く」まで。
PR:https://github.com/PerfectRubyonRails-Rindoku/Perfect_Ruby_on_Rails_Ch6/pull/19

次回

7-4-7 「データを入力して登録するテストを書く」から。🚂

学んだこと・感想

  • @sharoa

    • 久しぶりの輪読会で、前回までやっていたOmniAuthやFactoryBotの定義など忘れている部分があった。
    • テストコードで失敗するとスクリーンショットされて、なぜ失敗したかの情報を得るのに有力な情報になる。
    • 作成したログインヘルパーを使うために、 test_helper.rbやapplication_system_test_case.rbに追記をしないといけない。
    • モック化というのが急に出てきてなんだ?と思ったけど、shodanさんの説明でなんとなくだけどわかった。急にわからん単語出てくるの、本当に多いw
  • @hiromisugie

    • 前回部分ですが、application_system_test_case.rbusing: headless_chromeとするとヘッドレスブラウザでChromeを起動せずにシステムテストを行うことができる(Chromeを使うときはusing: chrome
    • テスト内でsleep 5とすると5秒停止してくれる。Chrome起動で画面を見るときに一瞬で画面が変わってしまう時などに便利。
    • ログインヘルパーを作ることで、複数のシステムテストでもログイン処理がサッとできるようになる
    • setupメソッドは、いくつかのテストをするにあたって共通で先に行う動作をすることができる
    • teardownメソッドは、最後に行う動作を共通化して書ける
  • @shodan

    • 失敗時にスクショが取られるのはそういうものかな〜と思っていたけれど、実はtake_faild_screenshotというメソッドがテスト終了時に呼び出されているからだった。
    • さらにtake_screenshotメソッドを使えばいつでも好きなタイミングでスクショを撮れるというのは知れてよかった気がします。
    • OmniAuthのモック化の設定方法を覚えておくのは無理そうだけど、自分で使うときになったらパRailsのこのページに戻って来れるよう、ふわっとインデックスしておきたいです。
  • @moegi29

    • FactoryBotで定義したファイルを使ってuserをcreateしたりする様子を確認できた。やっぱりheadlessじゃなくブラウザ上でみれたほうがわかりやすいなぁと感じました。
    • プロダクトコードがある状態→事前に作ったプロダクトのコードがあって後からテストをする状態のこと。
    • OmniAuth.config OmniAuthを使う場合特有のメソッドがあるということを覚えておきたい
  • @motohiro-mm

    • テストコードだけを後から作成したいときはbin/rails g test_unit:scaffold モデル名
    • 失敗時にスクショが撮られる:take_failed_screenshotメソッド、常にスクショを撮る:take_screenshotメソッド
    • モック化:テストに必要な部品の値を擬似的に設定するもの
    • require_relativeincludeのところは、言われて「なるほどな〜」ととても思いました
    • setup:テストの前に行う共通動作、teardown:テストが終わった後に行う共通動作

2024-01-05(金)

ファシリ

@motohiro-mm

ドライバー

@ayu-0505

読んだところ

7-4-7 「データを入力して登録するテストを書く」から
7-4-8 「ダイアログを操作するテストを書く」まで。
PR:https://github.com/PerfectRubyonRails-Rindoku/Perfect_Ruby_on_Rails_Ch6/pull/20

次回

7-5 「コントローラに対する機能テスト」から。🚂

学んだこと・感想

  • @sharoa

    • fill_inメソッドとselectメソッドを使ってフォームにデータを入力して登録するテストを書くことができる。
    • テストを実行した時のrunassertionsの数が違うのがなんか気になる。。。。
    • 削除ボタンを押した時に出てくる「本当に削除してもいいですか?」と言ったダイアログを操作するテストを書くこともできる。
    • テストで時刻を制御することもできる。travel_toメソッド覚えておこう。(メソッド名が素敵ですねw)
    • テストで結構なんでもできる?!すごっ。
  • @hiromisugie

    • システムテストでfill_inselectなどのメソッドを使って画面に入力したり、click_onメソッドで画面を進んでいくのを設定して実際に画面が動くのを見るのは、なんというか楽しい(書籍で既に書かれたものを見る分には楽しいけど、自分でゼロから書くとなるとかなりモタつきそうだなとも思った)
    • assert_differenceというのを初めて知った。assertなんちゃらは画面上で表示されているものに対して行うものだと思っていたのですが、イベントの数が1つ減った、みたいなこともテストできることを知った。
    • 時間を移動するためのヘルパーがtravel_toという名前なのが、洒落ているなと思った
  • @moegi29

    • travel_toヘルパーを使って現在時刻を変更するテストができる。また、FactoryBot.createメソッドで指定するstart_atの値を変更してテストを書くこともできる。今日でシステムテスト終わり、いろんなテストの書き方がある
    • JSの画面書き換えを待たずにテストが失敗する場合がある。assert_text や assert_selector に置き換えて回避することができるらしい。shodanさんが貼ってくれた解説をちゃんと読んでおきたいです。
  • @shodan

    • Capybaraのselectメソッドで、セレクトフォームへの入力ができる
    • accept_confirmメソッドにブロックを渡すと、そのブロックの操作の中で出現したダイアログに対してOKボタンを押させることができる
    • travel_toメソッドに時刻とブロックを渡すと、その時刻を現在時刻として、ブロック内の操作を行なってテストすることができる(テスト実行時の時刻を制御するヘルパー)
    • assert_differenceの第一引数の処理が「文字列」であることが地味にハマりポイントだったことがあります
      • assert_difference("Event.count", -1)の第一引数が「文字列」
      • 第一引数に渡した「式の文字列」を内部処理でRubyのコードとして実行するという、メタプログラミング(通称:黒魔術)というのをやっているそうです
  • @ayu-0505

    • fill_inメソッドとselectメソッドを使ってフォームにデータ入力を行う。
    • ダイアログ操作をする際はaccept_confirmメソッドを使用すると、渡されたブロック内で表示されたダイアログに対してOKボタンをクリックしてくれる。(ということはキャンセルボタンをクリックするメソッドもあるかも?)
    • assert_differenceメソッドでは渡したブロック内の処理の前後の変化を確認できる。
    • travel_toメソッドを使用するとブロックで引き渡した時刻に現在時刻が差し代わる。
    • assert〜系のメソッドはJSの表示を最短時間で待ってくれるらしいので、色々活用したい。
  • @motohiro-mm

    • fill_inメソッドとselectメソッドでフォームにデータを入力できる
      • 時刻の入力が大変そうだなと思いました
    • ダイアログの操作はaccept_confirm do ~ endで書く
    • assert_difference渡したブロック中の処理の前後で結果が変わっていることをみている
    • travel_toヘルパーでタイムスリップできる

Select a repo