Ruby
Rails
RSpec
unittest
mvc

RSpecのController SpecからRequest Specへの移行

業務でRuby on Rails(5.1.4)アプリのテストを書いている。ControllerのテストはController Specというので書いていたのだが、これは徐々に非推奨になっていくからRequest Specにしろ(やボケ)と公式に書いてあったので、その2つがどう違うのか理解しつつメモしておく(2017-12-28現在の情報)。

ちなみに私はオブジェクト指向やテスト駆動については一通り知っているが、rubyを本格的に触り始めて3か月のへっぽこrubyistなので、railsの思想的背景やrubyならではの事情に詳しくない。

非推奨になった事情

Request Specとは(公式)

まずは、このサンプルコードをコピペして、自分のプロジェクトで動くようにカスタマイズするとよいと思う。雰囲気はわかる。

よく知っている人の情報(英語)を探す

rspec controller spec deprecated でググったら一番に出てきたのがこれ。
https://everydayrails.com/2016/08/29/replace-rspec-controller-tests.html
1年ほど前(2016年8月)の記事だがそんなに変なこと言ってなさそうなので、以下、これをかいつまんで話す。

  • 著者はこの人。https://www.aaronsumner.com/
    • RailsやRSpecのコミッタではないが、それなりに信頼できる人だと思われる。ググった情報を読むときに超重要なのは、該当事項をよく理解している人が書いた記事かどうか。

記事の概要

コードは記事そのものを見てほしい。
Request Specの利点(太字は私の感想)

  • Controllerのメソッドを直で叩くのではなく、アプリケーションのエンドポイントを直に文字列指定もしくは変数による指定で叩ける。これによって、routeの設定ファイルがきちんと設定できていることや、変数がアプリ的に認識されていることもテストできる。
    • この方が、クライアント側から実際に疎通することをより正確に確認できる。

ちなみにこの記事にはPart 2, 3とあり、3はつい先月出た。

  • Part 2 は、すでにassignsをボコボコ書いてるテストを移行するならcapybaraFeature Specを使えという話。これは次PJでやってみたい。
  • Part 3 は、テストどうこうというよりは、Controllerからビジネスロジックを排除してModelに書く話。長いけど、後半に業務ロジックごとにクラスを分ける話(Service Objectと言うらしい)が出てきて興味深い。全然知らなかったけど、10月ぐらいからRails界隈で議論になっているそうな(これとかその反論とか)。これはこれで別記事としてまとめたい。