fv17の日記

Webエンジニアの備忘用ブログです。主にWeb界隈の技術に関して書いています。

Rails Tutorial - 第3章 ほぼ静的なページの作成(備忘・復習用)

自分の備忘・復習用。
必要だと思った部分のみ抽出。

本章で学ぶこと

  • 静的なページの作成
  • 自動化テストの雰囲気

アプリ作成と開発準備

  • rails new
  • Gemfileの更新
  • bundle install --without production
  • git initコマンドでGitの初期化
  • README.mdの更新
  • Bitbucketにリポジトリを作成しpush
  • ブランチを切る
git checkout -b 'static-pages'

コントローラを作成

rails generate controller StaticPages home help

bitbucketにpush

git add -A
git commit -m 'Add a Static Pages Controller'
git push -u origin static-pages

新しくAboutページとアクションを追加する

まずはテストから記述

テストを書くメリット

  • 不具合が減る
  • リファクタリングにおいて、既存機能を壊さない。(デグレしない)
  • テスト自体が仕様を表すドキュメントになる

テスト駆動では、red ・ green ・ REFACTORの順で実装する

aboutに関するテストを追加する。コントローラ作成時に、テストファイルは自動で作成されているため、そのファイルにテストを追加すれば良い。

class StaticPagesControllerTest < ActionDispatch::IntegrationTest
  (省略)
  test "should get about" do
    get static_pages_about_url
    assert_response :success
  end
end

テストを書くと当然失敗する、すなわちREDの状態となる。
この次はGREENにするためにいよいよ実装。

  • route.rbにaboutを追加
  • StaticPagesControllerにaboutアクションを追加
  • Viewにabout.html.erbを追加

機能追加時もRed ・ Green ・ Refactorの順

aboutページとアクションの追加が完了したが、ページの内容に応じて、ページのタイトルを自ら書き換えて表示する機能を追加したい。この時も、まずテストから書く。

(1)まず、ページタイトルに関するテストを書く - RED

class StaticPagesControllerTest < ActionDispatch::IntegrationTest
  def setup
    @base_title = Ruby on Rails Tutorial Sample App
  end

  test "should get home" do
    get static_pages_home_url
    assert_response :success
    assert_select "title", "Home | #{@base_title}"
  end

  # 省略 - helpやaboutアクションにも同様にtitleのassertを追加
end

(2)ページタイトルを実装する - GREEN、REFACTOR

まず動くように実装(GREEN)し、その次にDRYに沿うようにリファクタリングする。リファクタリング時にテストを都度実行し、機能が正しいかどうか確認するのが肝。テストがないとリファクタリングしても、正しいかどうか確認できない。最終的に下記となる。

home.html.erb

<% provide(:title, "Home") %>
<h1>Sample App</h1>
<p>
  This is the home page for the
  <a href="https://railstutorial.jp/">Ruby on Rails Tutorial</a>
  sample application.
</p>

application.html.erb

<title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>

テスト結果を見やすいようにminitest reportersを導入

test/test_helper.rb

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
# 以下、2行を追加するだけ
require "minitest/reporters"
Minitest::Reporters.use!