ぞえの技術めも

Ruby on Rails勉強中

【98日目】【1日20分のRailsチュートリアル】【第9章】ユーザー情報の編集に失敗したときの処理とテストを作成

Ruby on Railsチュートリアル(第3版)

今日は「9.1.2 編集の失敗」から。

9.1.2 編集の失敗

本項では、7.3のユーザー登録に失敗したときと似た方法で、編集に失敗した場合について扱っていきます。

まずUsersコントローラーにupdateアクションを追加する。

app/controllers/users_controller.rb

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      # 更新に成功したときの処理
    else
      render 'edit'
    end
  end

Userモデルのバリデーションとエラーメッセージのパーシャルが既にあるので (リスト9.2)、無効な情報を送信すると役立つエラーメッセージが表示されるようになっています (図9.3)。

サーバーを起動して

$ rails server -b $IP -p $PORT

パスワード空のまま「Save changes」ボタン押してみる。

f:id:kt_zoe:20170116125027p:plain

エラーメッセージが表示されることを確認。

9.1.3 編集失敗時のテスト

コラム3.3で説明したテストのガイドラインに従って、エラーを検知するための統合テストを書いていきましょう。

コマンドで統合テストを生成する。

$ rails generate integration_test users_edit
      invoke  test_unit
      create    test/integration/users_edit_test.rb

最初は編集失敗時の簡単なテストを追加します (リスト9.6)。

無効な情報を送信してみて、editビューが更新されるかを見るテスト。

test/integration/users_edit_test.rb

require 'test_helper'

class UsersEditTest < ActionDispatch::IntegrationTest

  def setup
    @user = users(:michael)
  end

  test "unsuccessful edit" do
    get edit_user_path(@user)
    assert_template 'users/edit'
    patch user_path(@user), user: { name:  "",
                                    email: "foo@invalid",
                                    password:              "foo",
                                    password_confirmation: "bar" }
    assert_template 'users/edit'
  end
end

現時点ではテスト通ります。

$ bundle exec rake test
30 tests, 69 assertions, 0 failures, 0 errors, 0 skips

今日の学習時間は【20分】

次は「9.1.4 TDDで編集を成功させる」から。

TDDってなんだ。