###リンクのテスト
レイアウト内のいくつかのリンクを埋めることができたので、これらのリンクが正しく動いているかどうかチェックするテストを書いてみよう。
ブラウザを立ち上げてルート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ページが正しいビューを描画しているかどうか確かめます。
####レイアウトのリンクに対するテスト
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属性をオプションで指定して調べています。
assert_select "a[href=?]", about_path
Railsは自動的にはてなマーク "?" をabout_pathに置換しています
これにより、次のようなHTMLがあるかどうかをチェックすることができます。
<a href="/about">...</a>
ルートURLへのリンクは2つ
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
下で示すように、Applicationヘルパーで使っているfull_titleヘルパーを、test環境でも使えるようにすると便利です。
#####test環境でもApplicationヘルパーを使えるようにする
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
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ヘルパーの単体テスト
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 <期待される値>, <実際の値>
といった形で使っていましたが、
内部では==演算子で期待される値と実際の値を比較し、正しいかどうかのテストをしています。
完璧なテストにすることを求められている。
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
感想
照らし合わせるらしい。