学習メモ 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

rails test をして、GreenになればOK!

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>
````