読者です 読者をやめる 読者になる 読者になる

ぞえの技術めも

Ruby on Rails勉強中

【14日目】【1日20分のRailsチュートリアル】テスト駆動開発でAboutページ作成

Ruby on Railsチュートリアル(第3版)

今日は「3.3.2 Red」から。

3.3.2 Red

テスト駆動開発

  1. 「失敗するテストを最初に書く」
  2. 「次にアプリケーションのコードを書いてパスさせる」
  3. 「必要ならリファクタリングする」

のように進めるらしい。

「失敗するテスト」としてAboutページのテストコードを追加する。

test/controllers/static_pages_controller_test.rb

  test "should get about" do
    get :about
    assert_response :success
  end

テスト実行。
Aboutページはまだ作ってないのでもちろん失敗します。

$ bundle exec rake test
   :
  1) Error:
StaticPagesControllerTest#test_should_get_about:
ActionController::UrlGenerationError: No route matches {:action=>"about", :controller=>"static_pages"}
    test/controllers/static_pages_controller_test.rb:15:in `block in <class:StaticPagesControllerTest>'

3 runs, 2 assertions, 0 failures, 1 errors, 0 skips

3.3.3 Green

エラーメッセージに従って、
まずルーティングファイルにAboutページ用のルートを追加。

config/routes.rb

  get 'static_pages/about'

再びテスト実行。
ルート追加前とエラーメッセージが変わりました。

$ bundle exec rake test
   :
  1) Error:
StaticPagesControllerTest#test_should_get_about:
AbstractController::ActionNotFound: The action 'about' could not be found for StaticPagesController
    test/controllers/static_pages_controller_test.rb:15:in `block in <class:StaticPagesControllerTest>'

3 runs, 2 assertions, 0 failures, 1 errors, 0 skips

「アクションが見つからない」って言われたので
StaticPagesコントローラにaboutアクションを追加する。

app/controllers/static_pages_controller.rb

  def about
  end

三たびテスト実行。
今度は何かな。

$ bundle exec rake test
   :
  1) Error:
StaticPagesControllerTest#test_should_get_about:
ActionView::MissingTemplate: Missing template static_pages/about, application/about with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}. Searched in:
  * "/usr/local/rvm/gems/ruby-2.3.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates"
  * "/home/ubuntu/workspace/sample_app/app/views"
  * "/usr/local/rvm/gems/ruby-2.3.0/gems/web-console-2.0.0.beta3/app/views"

    test/controllers/static_pages_controller_test.rb:15:in `block in <class:StaticPagesControllerTest>'

3 runs, 2 assertions, 0 failures, 1 errors, 0 skips

Aboutページのテンプレート、つまり「View」がないって怒られました。
じゃあAboutページの「View」を追加してあげましょう。

app/views/static_pagesabout.html.erbを追加する。
GUI使ってもいいけどせっかくなのでターミナル上からファイル作成する。

$ touch app/views/static_pages/about.html.erb

空ファイルが作成されるので下記のように更新。

app/views/static_pages/about.html.erb

<h1>About</h1>
<p>
  The <a href="http://www.railstutorial.org/"><em>Ruby on Rails
  Tutorial</em></a> is a
  <a href="http://railstutorial.jp">book</a> and
  <a href="http://screencasts.railstutorial.org/">screencast series</a>
  to teach web development with
  <a href="http://rubyonrails.org/">Ruby on Rails</a>.
  This is the sample application for the tutorial.
</p>

四度目のテスト実行。
もう大丈夫でしょ。

$ bundle exec rake test
   :
Finished in 0.269752s, 11.1213 runs/s, 11.1213 assertions/s.

3 runs, 3 assertions, 0 failures, 0 errors, 0 skips

通りました!

Aboutページの動作も見ておく。

<ローカルアドレス>/static_pages/about

f:id:kt_zoe:20160728123939p:plain

3.3.4 リファクタリング

ソースコードの乱れについての説明。
当初は予定していなかった機能の追加でソースコードがぐっちゃぐちゃになるのはあるあるですね…。
行き当たりばったりで作ったせいで分かりにくかったので、クラス設計から作り直したこともあります。(ちょうどそのとき仕事が暇だった)
暇になることなんてもうそうそうないのでこまめなリファクタリング大事ですね。
詳しくは3.4.3で解説とのこと。

今日はちょっとしたテスト駆動開発の実践でした。 作業時間は【25分】

次は「3.4 少しだけ動的なページ」から。