業務でRuby on Rails(5.1.4)アプリのテストを書いている。ControllerのテストはController Specというので書いていたのだが、これは徐々に非推奨になっていくからRequest Specにしろ(やボケ)と公式に書いてあったので、その2つがどう違うのか理解しつつメモしておく(2017-12-28現在の情報)。
ちなみに私はオブジェクト指向やテスト駆動については一通り知っているが、rubyを本格的に触り始めて3か月のへっぽこrubyistなので、railsの思想的背景やrubyならではの事情に詳しくない。
非推奨になった事情
- http://rspec.info/documentation/3.7/rspec-rails/#label-Controller+Specs
- http://rspec.info/blog/2016/07/rspec-3-5-has-been-released/#rails-support-for-rails-5
- 確かに、突然assignsって叩いてチェックするテストはなんだかなー、テストコードださいなー、と思っていたので、ちょうど良い。
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はつい先月出た。