総合テストの概要_Railsチュートリアル5章より

Rails tutorialの第5章内にありました、Railsにおける総合テストについてまとめました。

総合テスト

例えば、レイアウトにリンクをはっているとし、これらをテストしてみます。 f:id:onthebacksoftheflyer:20190113155352p:plain リンクを一つ一つクリックしてこれらのリンクが正しく動いているかどうかチェックすることもできますが、
変更が入るたびに同じことをやるのは面倒です
そこでこれらをテストする総合テストを書いてみます。

総合テストの準備

まずnavバーにHelpリンクを貼るとします。

ルーティング→リンクを貼る→テストコードを書く

という流れです。

ルーティング

まずroute.rbにHelpページ対するルーティングを書いていきます
書き方は色々ありますが、例として以下の3通りをあげます。

#1.help_url
  get 'static_pages/help' 

#2.help_path
  get '/help',    to: 'static_pages#help' 

#3.halfにアクセスするとhelp_urlとなる
  get '/help', to: 'static_pages#help', as: 'half' 
  1. URL:/static_pages/helpにアクセスすると、static_pagesコントローラのhelp アクションにルーティングします
    またRailsのビューテンプレートでurlを表すパスが、help_urlとなります
  2. URL:/helpにアクセスすると、static_pagesコントローラのhelp アクションにルーティングします またRailsのビューテンプレートでurlを表すパスが、help_pathとなります
  3. URL:/halfにアクセスすると、static_pagesコントローラのhelp アクションにルーティングします またRailsのビューテンプレートでurlを表すパスが、help_pathとなります
No. URL ビューテンプレート
#1.help_url /static_pages/help help_url
#2.help_path /help help_path
#3.half /half help_path

asの使い方ついては下記に詳しいです。 tkymtk.hatenablog.com

リンク

次にリンクを貼ります application.html.erb

<%= link_to "Help", help_path %>

これをerbからhtmlに起こすと<a href="/static_pages/helo">Help</a>となります

テストコード

次にユニットテストコードを作ります test/controllers/static_pages_controller_test.rb

require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest
  test "should get help" do
    get help_path
    assert_response :success
  end
end

ここでget help_pathとすることでビューテンプレートのhelp_path(ここでは/help)をGETしに行きます
ここで$ rails tユニットテストするのも一つですね。

総合テスト

上記以外にもルートページをルーティングしリンクを貼ることにします
(ここではHomeページにルーティングすることとします。Homeページにはナビバーを設定し、Home、Help、About、Contactのリンクを貼ることにします。)

RailsチュートリアルでのHomeページ
RailsチュートリアルでのHomeページ

このリンクが正しく貼られているかを試験するために、総合テストを行います。
総合テストではアプリを上から下まで一通り舐めることができます。(ただし文言といった細かい項目はユニット試験で行う方が良いでしょう)

総合テストの試験項目として 1. ルートURL にGETリクエストを送る. 2. 正しいページテンプレートが描画されているかどうか確かめる. 3. Home、Help、About、Contactの各ページへのリンクが正しく動くか確かめる.

を設定します

テストコード作成

まず総合テスト用のテストコードを作っていきます。
以下のコマンドでテストコードのテンプレートが作成できます。

$ rails generate integration_test site_layout

次にassert_templateメソッドを使って、Homeページが正しいビューを描画しているかどうか確かめます

  test "layout links" do
    get root_path #1
    assert_template 'static_pages/home' #2
    #3
    assert_select "a[href=?]", root_path, count: 2 #同じページにroot_pathが2つあるためcount 2
    assert_select "a[href=?]", help_path # htmlにaタグがあってpathがhelp_pathがあるかどうか
    assert_select "a[href=?]", about_path
    assert_select "a[href=?]", contact_path
  end

テストコード中#1 get root_pathでルートページをGETできるか #2 assert_template 'static_pages/home'で'static_pages/home'ページテンプレートが描画されているか #3でそれぞれのリンクにアクセスできるかを確認します。

総合テスト実施

あとは$ rails test:integrationを叩くと総合テストが実施されます。