実装するにあたり、テストを記述したのち、処理をコーディングする

###  <font color='lightblue'>背景</font>
現場でのあるあるですが、普段は以下の流れで開発を進めることが多いと思います。
(1)設計→(2)処理のコーディング→(3)テストのコーディング→(4)単体テストなど…

しかし、Railsチュートリアルでは、
(1)設計→(2)テストのコーディング→(3)処理のコーディング…
という流れで解説されていました。自分も少し勉強になったので、記事として掲載しようと思います。

###  <font color='lightblue'>環境</font>
| 項目              |               内容 | 
|:-----------------|:------------------:|
| OS      |          aws #35-Ubuntu SMP(Cloud9)|      
| Ruby             |            ruby 2.6.3p62 (2019-04-16 revision 67580) |  
| Ruby On Rails    |           Rails 6.0.3 |

###  <font color='lightblue'>対応</font>
以下は、ルーティング、コントローラが設定されているアプリに、新たにabout(概要)ページを追加する場合、テストソースからコーディングする例です。

```ruby:config/route.rb
Rails.application.routes.draw do
  get 'static_pages/home'
  get 'static_pages/help'
  root 'static_pages#home'
※概要ページのルーティングはまだ設定されていません。
end
```


```ruby:app/controller/static_pages_controller.rb
class StaticPagesController < ApplicationController
  def home
  end

  def help
  end
   
※概要ページのアクションはまだ設定されていません。
end
```

手順１）ここで、新たに追加するページに対するテストを予め記述しておきます。

```ruby:test/static_pages_controller_test.rb
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 
```

手順２）テストを実行してみる（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
```
<font color="red">エラーが出てしまいました。</font>

手順３）上記から、パスが通っていないので、ルーティングを見直します。

```ruby:config/route.rb
Rails.application.routes.draw do
  get 'static_pages/home'
  get 'static_pages/help'
  get 'static_pages/about'  ←ここを追加した☆
  root 'static_pages#home'
end
```

手順４）テストを実行する（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
```
<font color="red">またエラーが出てしまいました。</font>

手順５）上記エラーから、アクションが原因なのでコントローラを見直します。

```ruby:app/controller/static_pages_controller.rb
class StaticPagesController < ApplicationController
  def home
  end

  def help
  end

  def about   ←ここを追加した☆
  end

end
```

手順６）さらにテストを実行してみる（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
```

<font color="red">またエラーが出てしまいました。次はまた文言が違うようです…</font>

手順７）上記エラーから、テンプレートが原因のようなのでビューを追加します。

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


手順８）テストを実行する（4回目＝正常テストパス）

```
$ rails test

...
3 runs, 3 assertions, 0 failures, 0 errors, 0 
```

<font color="blue">上手くいきました…基本中の基本ですが、リファクタリングを含めておさえておくべき内容だと感じました。</font>


###  <font color='lightblue'>参考文献</font>
[チュートリアル.テストから始める](https://railstutorial.jp/chapters/static_pages?version=6.0#sec-getting_started_with_testing)