【RSpec】Ruby on Rails チュートリアル「第５章」のテストを RSpec で書いてみた

# はじめに
こちらは前回の続きとなります。

【RSpec】Ruby on Rails チュートリアル「第4章」のテストを RSpec で書いてみた
https://qiita.com/t-nagaoka/items/4565a453596dfa0b0e3e
## 対象者
+ Ruby on Rails チュートリアルのテストを Rspec で実施予定、または実施してみたい人
+ Ruby on Rails チュートリアル「第５章」のテストを Rspec で書きたいけど、書き方が分からない人

## テストコード
実際にテストコードを書き換えた結果が下記になります。
### Minitest
```ruby:test/controllers/static_pages_controller_test.rb
class StaticPagesControllerTest < ActionDispatch::IntegrationTest

  test "should get home" do
    get root_path
    assert_response :success
    assert_select "title", "Ruby on Rails Tutorial Sample App"
  end

  test "should get help" do
    get help_path
    assert_response :success
    assert_select "title", "Help | Ruby on Rails Tutorial Sample App"
  end

  test "should get about" do
    get about_path
    assert_response :success
    assert_select "title", "About | Ruby on Rails Tutorial Sample App"
  end

  test "should get contact" do
    get contact_path
    assert_response :success
    assert_select "title", "Contact | Ruby on Rails Tutorial Sample App"
  end
end
```
```ruby:test/integration/site_layout_test.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")
    get signup_path
    assert_select "title", full_title("Sign up")
  end
end
```
```ruby:test/helpers/application_helper_test.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
```
```test/controllers/users_controller_test.rb
class UsersControllerTest < ActionDispatch::IntegrationTest

  test "should get new" do
    get signup_path
    assert_response :success
  end
end
```
### RSpec
```spec/requests/static_pages_spec.rb
require "rails_helper"

RSpec.describe "StaticPages", type: :request do
  describe "Home page" do
    it "should get root" do
      visit root_path
      expect(page.status_code).to eq(200)
      expect(page).to have_title full_title
      expect(page).not_to have_title "Home |"
    end
  end

  describe "Help page" do
    it "should get help" do
      visit help_path
      expect(page.status_code).to eq(200)
      expect(page).to have_title full_title("Help")
    end
  end

  describe "About page" do
    it "should get about" do
      visit about_path
      expect(page.status_code).to eq(200)
      expect(page).to have_title full_title("About")
    end
  end

  describe "Contact page" do
    it "should get contact" do
      visit contact_path
      expect(page.status_code).to eq(200)
      expect(page).to have_title full_title("Contact")
    end
  end
end
```
```spec/features/site_layout_spec.rb
require 'rails_helper'

RSpec.describe "SiteLayoutTest", type: :feature do
  before { visit root_path }
  subject { page }
  scenario "layout links" do
    is_expected.to have_link nil, href: root_path, count: 2
    is_expected.to have_link nil, href: help_path
    is_expected.to have_link nil, href: about_path
    is_expected.to have_link nil, href: contact_path
    visit contact_path
    expect(page).to have_title full_title("Contact")
    visit signup_path
    expect(page).to have_title full_title("Sign up")
  end
end
```
```spec/helpers/application_helper_spec.rb
require "rails_helper"

RSpec.describe ApplicationHelper, type: :helper do
  describe "full_title" do
    context 'no argument' do
      it 'return 「Ruby on Rails Tutorial Sample App」' do
        expect(full_title).to eq("Ruby on Rails Tutorial Sample App")
      end
    end
    context 'argument is "Help"' do
      it 'return 「Help | Ruby on Rails Tutorial Sample App」' do
        expect(full_title("Help")).to eq("Help | Ruby on Rails Tutorial Sample App")
      end
    end
  end
end
```
```spec/requests/users_controller_spec.rb
require 'rails_helper'

RSpec.describe UsersController, type: :request do
  describe "GET #new" do
    it "returns http success" do
      get signup_path
      expect(response).to have_http_status(:success)
    end
  end
end
```
###ポイント
full_title ヘルパーを使用するためには、以下のように rails_helper.rb で ApplicationHelper を読み込む必要があります。

```spec/rails_helper.rb
RSpec.configure do |config|
  include ApplicationHelper
```
##次回
「第６章」のテストコードを RSpec に書き換える予定です。