学習メモ 2
テストコート
意義
テストが揃っていれば、機能停止に陥るような回帰バグ(Regression Bug: 以前のバグが再発したり機能の追加/変更に副作用が生じたりすること)を防止できる。
テストが揃っていれば、コードを安全にリファクタリング(機能を変更せずにコードを改善)できる。
テストコードは、アプリケーションコードから見ればクライアントとして動作するので、アプリケーションの設計やシステムの他の部分とのインターフェイスを決めるときにも役に立つ
エラーの種類
$ rails test NameError: undefined local variable or method `static_pages_about_url'
AboutページへのURLが見つからないために、ルーティングを修正する。
Rails.application.routes.draw do get 'static_pages/home' get 'static_pages/help' get 'static_pages/about' root 'application#hello' end
次にrails testをする。
$ rails test AbstractController::ActionNotFound: The action 'about' could not be found for StaticPagesController
StaticPagesコントローラにaboutアクションがないので、aboutアクションを追加する。
class StaticPagesController < ApplicationController def home end def help end def about end end
次にrails testをする。
$ rails test ActionController::UnknownFormat: StaticPagesController#about is missing a template for this request format and variant.
Railsではテンプレートはviewのことを指す。
app/views/static_pagesディレクトリにabout.html.erbというファイルを作成する。
$ touch app/views/static_pages/about.html.erb
Refactor
テストが green になったので、安心してコードをリファクタリングできるようになりました。アプリケーションの開発が進むと、コードのどこからともなく「腐敗臭」が漂い始めます。コードや記法の統一が崩れて読みづらくなる、クラスやメソッドが何百行にも膨れ上がって読む気を削がれる、なぜこのコードがここにあるのか最早誰もその理由を思い出せなくなる、同じコードがあちこちにコピペされて少しずつ書き換えられ手に負えなくなる、などです。コンピュータにしてみればどんなに汚らしいコードであろうと、そこにあるがままに実行するだけですが、人間はそういうわけにはいきません。こまめにリファクタリングを繰り返してコードを常にすみずみまで美しくコンパクトに保ち、他の開発者や未来の自分の開発意欲を阻喪することのないようにしなければなりません。
タイトルをテスト
同じコードを繰り返すことはRubyの「DRY」(Don’t Repeat Yourself: 繰り返すべからず)という原則に反します。
重複を取り除くテクニックの1つとして、ビューで「埋め込みRuby」(Embedded Ruby)が使えます。
app/views/static_pages/home.html.erb
app/views/static_pages/help.html.erb
app/views/static_pages/about.html.erb
上記のTOPに<% provide(:title, "Home/Help/About") %>
とする。
- app/views/layouts/application.html.erb
上記に<title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>
とすると、挿入できる。
<!DOCTYPE html> <html> <head> <title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title> <%= csrf_meta_tags %> <%= csp_meta_tag %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> </head> <body> <%= yield %> </body> </html> ````