猫Rails

ねこー🐈

Sendagaya.rbさんに初参加させていただきました!

先日お仕事のために東京に引っ越したのですが、未だにベッドが届かず床に寝ています。引っ越し作業大変すぎて、仕事開始までに終わるか心配になってきました・・・。

昨日Sendagaya.rb #295に参加させていただきました!

ずっと田舎に引きこもっていて勉強会に参加させていただくのは久しぶりだったので緊張しましたー。

流れとしてはこんな感じでした。

  1. @s4naさんの技術的な相談をみんなで考える
  2. 自己紹介
  3. 軽い懇親会(のはずでしたがお店がギリギリ閉まってしまった)

@s4naさんの技術的な相談をみんなで考える

RubyにはWebMockというHTTPリクエストをモックするgemがあるのですが、それがうまく機能しないという相談でした。モックしているはずなのにリクエストが飛んでしまう。

提示されたコードはこんな感じでしたー

WebMock.enable!
WebMock.stub_request(:get, url).to_return(response)

いろんな意見が出しましたが、以下覚えている部分だけ箇条書きでー。

  • モックするコードの直後にブレークポイント仕掛けて試行錯誤してみると良いかも
  • HTTPメソッドやURLがマッチしていない可能性がありそう
    • 問題を切り分けるために、:any*を使ってそもそもリクエストがモックできるのか調べてみよう -> モックできなかった。モックするコードではなく、他の部分に問題がありそう
  • 特定の条件でモックがdisabledになってしまう可能性がありそう
  • 何か見落としがありそう。そもそも論として処理のフローはどんな感じ?
    • 検索ボタンを押す -> ブラウザからサーバーに/tweets.json(クエリパラメータ) -> サーバーがtwitter gemを使って、ツイートを取得 -> サーバーがJSONでブラウザに情報を返す
    • テストコードではCapybaraのvisitメソッドを使ってAPIにアクセスしている。ここをモックしたい。 -> あれ?visitってモックできるんだっけ?
  • Webmockはどの部分をモックする?
    • おそらくNet::HTTP等のRubyの主要なHTTPライブラリのリクエスト部分をモックしているはず
    • visitはブラウザアクセスなのでモックできないのでは? -> これが原因だった

ということで、Web APIvisitでブラウザアクセスしていたのでモックできないということでしたー。

この後もここから派生して色々な学びがありました。

  • ブラウザアクセスをWebmockでモックできるgemがあるよ -> puffing-billy
  • リクエスト情報をダンプするgemがあるよ。めっちゃ便利そう -> http-dump
  • コントローラーにTwitterAPIへのアクセス処理をベタ書きしてしまっている。これだとFatコントローラーなので、Twitterへのアクセス部分だけPOROに切り出すと良さそう
    • 外部APIへのアクセスは結構変更があったりするので、切り出しておくと修正しやすくなる
    • モックが簡単になる。リクエストをモックするというより、リクエストの処理をインスタンスメソッドに閉じ込めて、そこを丸ごとモックするのが良さそう
    • この場合、POROはmodels配下に置く。libに置いたりgemにしたりする人もいる(けどちょっとやり過ぎかも)
  • 上記のインスタンスメソッドは、どうやって単体テストをすればよい?
    • 外部APIをテストすることになってしまうので、テストは結構難しい
    • 毎回リクエストするのはまずいし、VCRを使ってキャッシュしておくと実質的にはテストにならない
    • リクエストの形式はテストできそう。ちゃんとした引数が渡っているか程度のテストでいいかなー
    • あとテストとは別で外部APIの動作をチェックするCIを用意する、っていうのは可能。例えば外部サイトの画面をスクレイピングして情報をとってくるような場合は、画面は変わりやすいのでチェックは必須になりそう。

感想

WebMockでモックできない件はあらためて考えてみると簡単なことなのですが、自分でPCを操作できない等の制約がある中で解決にまで至るのはなかなか大変でした。自分は見当違いなことを言ったり、そもそも問題を正しく理解できていなかったり、結構迷惑かけてしまいました。でも皆さんは1つずつ問題を切り分けたり、そもそもフレーム外の所に問題があるのでは?と気づいたりしていて、すごいなーと感心しっぱなしでした。どういう流れで解決まで至るか、@tkawaさん、@fukajunさん、@sanfrecce_osakaさん達、強い人達の思考の過程を生で見れたのはめちゃ勉強になりました!

あと今回は主催者の@tkawaさんと@fukajunさん以外、参加者の4人全員フィヨルドブートキャンプ生(卒業生含む)という奇跡が起きました✨自分はフルリモートでフィヨルドブートキャンプを卒業して、他の生徒さんと会うのは初めてだったので、なかなか緊張しました。でも3人とも優しい方だったので安心しました。よかったー。特に@NMPさんとはお互い上京したばかりで、初勉強会参加ということで意気投合しました。

そして主催者の@tkawaさんと@fukajunさんおふたりともとても優しい方で、本当リスペクトでした。Rubyコミュニティの方たちは、皆さん本当に優しいですよね。感動です✨

あと会場のランチェスターさんが凄くきれいでした。

久しぶりの勉強会で緊張しましたが、楽しいし勉強になるし最高の勉強会でした!主催者の皆さん、参加者の皆さん、会場提供してくださったランチェスターさん、ありがとうございましたー!