railsチュートリアル第五章 リンクのテスト

###リンクのテスト
レイアウト内のいくつかのリンクを埋めることができたので、これらのリンクが正しく動いているかどうかチェックするテストを書いてみよう。

ブラウザを立ち上げてルートURLにアクセスし、それぞれのリンクをクリックして確かめることもできる。
しかし変更する度にこの作業を毎回繰り返していくのは大きな負担です。
そこで、「```統合テスト（Integration Test）```」を使って一連の作業を自動化してみよう。
アプリケーションの動作を端から端まで（end-to-end）シミュレートしてテストすることができます。

site_layoutというテストのテンプレートを生成するところから始めてみます。

```
rails generate integration_test site_layout
      invoke  test_unit
      create    test/integration/site_layout_test.rb
```
Railsは渡されたファイル名の末尾に _test という文字列を追加することに注目

今回の目的は、アプリケーションのHTML構造を調べて、```レイアウトの各リンクが正しく動くかどうかチェック```することです。
1.ルートURL（Homeページ）に```GETリクエストを送る```。
2.正しい```ページテンプレートが描画されているか```どうか確かめる。
3.Home、Help、About、Contactの```各ページへのリンクが正しく動くか```確かめる。

Railsの統合テストでは、上のステップをコードに落とし込んでいくことになります。
具体的には、まずassert_templateメソッドを使って、Homeページが正しいビューを描画しているかどうか確かめます。
####レイアウトのリンクに対するテスト

```rb
require 'test_helper'

class SiteLayoutTest < ActionDispatch::IntegrationTest

  test "layout links" do
    get root_path
    assert_template 'static_pages/home'
    assert_select "a[href=?]", root_path, count: 2
    assert_select "a[href=?]", help_path
    assert_select "a[href=?]", about_path
    assert_select "a[href=?]", contact_path
  end
end
```
ssert_selectメソッドの高度なオプションを使っています。
今回のケースでは、特定のリンクが存在するかどうかを、aタグとhref属性をオプションで指定して調べています。

```rb
assert_select "a[href=?]", about_path
```
Railsは自動的にはてなマーク "?" をabout_pathに置換しています
これにより、次のようなHTMLがあるかどうかをチェックすることができます。

```rb
<a href="/about">...</a>
```
ルートURLへのリンクは2つ

```rb
assert_select "a[href=?]", root_path, count: 2
```
assert_selectには色々な指定の仕方があります。

Code	　　　　　　　　　　　　　　　　　　　　　マッチするHTML

```
assert_select "div"	　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　<div>foobar</div>
assert_select "div", "foobar"	　　　　　　　　　　　　　　　　　　　　　　<div>foobar</div>
assert_select "div.nav"	　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　<div class="nav">foobar</div>
assert_select "div#profile"	　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　<div id="profile">foobar</div>
assert_select "div[name=yo]"	　　　　　　　　　　　　　　　　　　　　　　　<div name="yo">hey</div>
assert_select "a[href=?]", '/', count: 1　	　　　　　<a href="/">foo</a>
assert_select "a[href=?]", '/', text: "foo"	<a href>
```

####演習
1.footerパーシャルのabout_pathをcontact_pathに変更してみて、テストが正しくエラーを捕まえてくれるかどうか確認してみてください。

```
ubuntu:~/environment/sample_app (filling-in-layout) $ rails t
Running via Spring preloader in process 15032
Started with run options --seed 32842

 FAIL["test_layout_links", #<Minitest::Reporters::Suite:0x00005647280aab20 @name="SiteLayoutTest">, 1.1666344549994392]
 test_layout_links#SiteLayoutTest (1.17s)
        Expected at least 1 element matching "a[href="/about"]", found 0..
        Expected 0 to be >= 1.
        test/integration/site_layout_test.rb:11:in `block in <class:SiteLayoutTest>'

  6/6: [==============================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.25144s
6 tests, 13 assertions, 1 failures, 0 errors, 0 skips
```

2.
下で示すように、Applicationヘルパーで使っているfull_titleヘルパーを、test環境でも使えるようにすると便利です。
#####test環境でもApplicationヘルパーを使えるようにする

```rb
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
require 'rails/test_help'
require "minitest/reporters"
Minitest::Reporters.use!

class ActiveSupport::TestCase
  # Run tests in parallel with specified workers
  parallelize(workers: :number_of_processors)

  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all
  include ApplicationHelper

  # Add more helper methods to be used by all tests here...
end

```
こうしておくと、下のようなコードを使って、正しいタイトルをテストすることができます。
#####est環境でfull_titleヘルパーを使う
#####test_helper.rb
```rb
require 'test_helper'

class SiteLayoutTest < ActionDispatch::IntegrationTest

  test "layout links" do
    get root_path
    assert_template 'static_pages/home'
    assert_select "a[href=?]", root_path, count: 2
    assert_select "a[href=?]", help_path
    assert_select "a[href=?]", about_path
    assert_select "a[href=?]", contact_path
    get contact_path
    assert_select "title", full_title("Contact")
  end
end
```
これは完璧なテストではありません。
この問題を解決するためには、full_titleヘルパーに対するテストを書く必要があります。
そこで、Applicationヘルパーをテストするファイルを作成し、下の部分を適切なコードに置き換えてみてください。
#####full_titleヘルパーの単体テスト

```rb
require 'test_helper'

class ApplicationHelperTest < ActionView::TestCase
  test "full title helper" do
    assert_equal full_title,         （コードを書き込む）
    assert_equal full_title("Help"), （コードを書き込む）
  end
end
```
ヒント: リスト 5.37では```assert_equal <期待される値>, <実際の値>```といった形で使っていましたが、
内部では==演算子で期待される値と実際の値を比較し、正しいかどうかのテストをしています。

完璧なテストにすることを求められている。


```rb
require 'test_helper'

class ApplicationHelperTest < ActionView::TestCase
  test "full title helper" do
    assert_equal full_title,  "Ruby on Rails Tutorial Sample App"       
    assert_equal full_title("Help"), "Help | Ruby on Rails Tutorial Sample App"
  end
end
```
感想
照らし合わせるらしい。