【RSpec】Railsチュートリアル第6版　第7章

#はじめに
Railsチュートリアル第6版のテストをRSpecで書き直していく。

###目次
- [第3章](https://qiita.com/supyolo888/items/35081ead2cfafb40a995)
- [第4章](https://qiita.com/supyolo888/items/939b670b62eb18467f6d)
- [第5章](https://qiita.com/supyolo888/items/42234ac2ed3919b14586)
- [第6章](https://qiita.com/supyolo888/items/bd10e64c77fe391cf203)
- 第7章（本記事）
- [第8章](https://qiita.com/supyolo888/items/508caaa40edf307093ed)
- [第9章](https://qiita.com/supyolo888/items/62e471b07a0c9a81575d)
- [第10章](https://qiita.com/supyolo888/items/a8695b20ec8082f85223)
- [第11章](https://qiita.com/supyolo888/items/5c81331e46f1d9d5ab3c)
- [第12章](https://qiita.com/supyolo888/items/fbb95671d39dfbf9df90)
- [第13章](https://qiita.com/supyolo888/items/c88b6acd4ff55750defc)
- [第14章](https://qiita.com/supyolo888/items/532390902bf3e0f5348e)

#Minitest

###ユーザー登録に対するテスト

```rb:test/integration/users_signup_test.rb
require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest

  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post users_path, params: { user: { name:  "",
                                         email: "user@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
    end
    assert_template 'users/new'
  end

  test "valid signup information" do
    get signup_path
    assert_difference 'User.count', 1 do
      post users_path, params: { user: { name:  "Example User",
                                         email: "user@example.com",
                                         password:              "password",
                                         password_confirmation: "password" } }
    end
    follow_redirect!
    assert_template 'users/show'
  end
end
```

#RSpec

###ユーザー登録に対するテスト

```rb:spec/system/users_signup_spec.rb
require 'rails_helper'

RSpec.describe "UsersSignups", type: :system do

  it "invalid signup information" do
    visit root_path
    click_on "Sign up"
    expect {
      fill_in "Name", with: ""
      fill_in "Email", with: "user@invalid"
      fill_in "Password", with: "foo"
      fill_in "Confirmation", with: "bar"
      click_button "Create my account"
    }.to_not change(User, :count)
    expect(page).to have_current_path users_path
    expect(page).to have_content("Name can't be blank")
    expect(page).to have_content("Email is invalid")
    expect(page).to have_content("Password confirmation doesn't match Password")
    expect(page).to have_content("Password is too short (minimum is 6 characters)")
  end

  it "valid signup information" do
    visit root_path
    click_on "Sign up"
    expect {
      fill_in "Name", with: "Example User"
      fill_in "Email", with: "user@example.com"
      fill_in "Password", with: "password"
      fill_in "Confirmation", with: "password"
      click_button "Create my account"
    }.to change(User, :count).by(1)
    expect(page).to have_current_path user_path(User.last)
    expect(page).to have_content("Welcome to the Sample App!")
  end

end
```
`click_on`でユーザー登録ページに移動し、`fill_in`でフォームに情報を入力した後、`click_button`で情報を送信する。
`expect(page).to have_current_path`で正しいページに移動しているかチェックし、`expect(page).to have_content`でエラーメッセージとフラッシュがページに存在しているかチェック。
最後の２行は、後に、ユーザー新規登録後有効化メールを送信しホームページに戻るように仕様変更するので削除することになる。