0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

ブラウザを立ち上げてルート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

感想
照らし合わせるらしい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?