背景
現場でのあるあるですが、普段は以下の流れで開発を進めることが多いと思います。
(1)設計→(2)処理のコーディング→(3)テストのコーディング→(4)単体テストなど…
しかし、Railsチュートリアルでは、
(1)設計→(2)テストのコーディング→(3)処理のコーディング…
という流れで解説されていました。自分も少し勉強になったので、記事として掲載しようと思います。
環境
項目 | 内容 |
---|---|
OS | aws #35-Ubuntu SMP(Cloud9) |
Ruby | ruby 2.6.3p62 (2019-04-16 revision 67580) |
Ruby On Rails | Rails 6.0.3 |
対応
以下は、ルーティング、コントローラが設定されているアプリに、新たにabout(概要)ページを追加する場合、テストソースからコーディングする例です。
Rails.application.routes.draw do
get 'static_pages/home'
get 'static_pages/help'
root 'static_pages#home'
※概要ページのルーティングはまだ設定されていません。
end
class StaticPagesController < ApplicationController
def home
end
def help
end
※概要ページのアクションはまだ設定されていません。
end
手順1)ここで、新たに追加するページに対するテストを予め記述しておきます。
require 'test_helper'
class StaticPagesControllerTest < ActionDispatch::IntegrationTest
1
2 test "should get home" do
3 get static_pages_home_url
4 assert_response :success
5 end
6
7 test "should get help" do
8 get static_pages_help_url
9 assert_response :success
10 end
11
12 ※~~~~ ここから想定で概要ページのテストを記入する。~~~~
13 test "should get about" do
14 get static_pages_about_url
15 assert_response :success
16 end
end
手順2)テストを実行してみる(1回目=まだ処理を記述していないのでエラーになる)
$rails test
Error:
StaticPagesControllerTest#test_should_get_about:
NameError: undefined local variable or method `static_pages_about_url'
..
Finished in 2.157942s, 1.3902 runs/s, 0.9268 assertions/s.
3 runs, 2 assertions, 0 failures, 1 errors, 0 skips
エラーが出てしまいました。
手順3)上記から、パスが通っていないので、ルーティングを見直します。
Rails.application.routes.draw do
get 'static_pages/home'
get 'static_pages/help'
get 'static_pages/about' ←ここを追加した☆
root 'static_pages#home'
end
手順4)テストを実行する(2回目=想定ではエラーになる)
$ rails test
Error:
StaticPagesControllerTest#test_should_get_about:
AbstractController::ActionNotFound: The action 'about' could not be found for StaticPagesController…
3 runs, 2 assertions, 0 failures, 1 errors, 0 skips
またエラーが出てしまいました。
手順5)上記エラーから、アクションが原因なのでコントローラを見直します。
class StaticPagesController < ApplicationController
def home
end
def help
end
def about ←ここを追加した☆
end
end
手順6)さらにテストを実行してみる(3回目=どうなるか…)
$ rails test
Error:
StaticPagesControllerTest#test_should_get_about:
ActionController::MissingExactTemplate: StaticPagesController#about is missing a template for request formats: ..
3 runs, 2 assertions, 0 failures, 1 errors, 0 skips
またエラーが出てしまいました。次はまた文言が違うようです…
手順7)上記エラーから、テンプレートが原因のようなのでビューを追加します。
touch app/views/static_pages/about.html.erb
手順8)テストを実行する(4回目=正常テストパス)
$ rails test
...
3 runs, 3 assertions, 0 failures, 0 errors, 0
上手くいきました…基本中の基本ですが、リファクタリングを含めておさえておくべき内容だと感じました。