読者です 読者をやめる 読者になる 読者になる

ぞえの技術めも

Ruby on Rails勉強中

【114日目】【1日20分のRailsチュートリアル】【第9章】ユーザー削除のテストを追加する

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

今日は「9.4.3 ユーザー削除のテスト」から。

9.4.3 ユーザー削除のテスト

ユーザー削除と同じくらい重要なことは、その振る舞いが期待されたかどうかを確かめる良いテストを書くことです。
そこで、まずはユーザー用fixtureファイルを修正し、今いるサンプルユーザーの一人を管理者にしてみます。

サンプルユーザーの1人目に管理者権限を追加。

test/fixtures/users.yml

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>
  admin: true

9.2.1で経験してきたように、Usersコントローラをテストするために、アクション単位でアクセス制御をテストします。
(中略)
1つは、ログインしていないユーザーであれば、ログイン画面にリダイレクトされることです。もう1つは、ログイン済みではあっても管理者でなければ、ホーム画面にリダイレクトされることです。

DELETEリクエストを発行してdestroyアクションを動作させたときの挙動をテストする。

test/controllers/users_controller_test.rb

  test "should redirect destroy when not logged in" do
    assert_no_difference 'User.count' do
      delete :destroy, id: @user
    end
    assert_redirected_to login_url
  end

  test "should redirect destroy when logged in as a non-admin" do
    log_in_as(@other_user)
    assert_no_difference 'User.count' do
      delete :destroy, id: @user
    end
    assert_redirected_to root_url
  end

このとき、リスト9.56ではassert_no_differenceメソッド (リスト7.21) を使って、ユーザー数が変化しないことを確認している点に注目してください。

ふーむ。

管理者であればユーザー一覧画面に削除リンクが表示される仕様を利用して、リスト9.44のテストに今回のテストを追加していくことにします。

元々あったページネーションを確認するテストに「削除」リンクをクリックしたときのテストも追加。
あと管理者権限をもたないユーザーがログインした場合は「削除」リンクが表示されていないテストも追加。

test/integration/users_index_test.rb

require 'test_helper'

class UsersIndexTest < ActionDispatch::IntegrationTest

  def setup
    @admin     = users(:michael)
    @non_admin = users(:archer)
  end

  test "index as admin including pagination and delete links" do
    log_in_as(@admin)
    get users_path
    assert_template 'users/index'
    assert_select 'div.pagination'
    first_page_of_users = User.paginate(page: 1)
    first_page_of_users.each do |user|
      assert_select 'a[href=?]', user_path(user), text: user.name
      unless user == @admin
        assert_select 'a[href=?]', user_path(user), text: 'delete'
      end
    end
    assert_difference 'User.count', -1 do
      delete user_path(@non_admin)
    end
  end

  test "index as non-admin" do
    log_in_as(@non_admin)
    get users_path
    assert_select 'a', text: 'delete', count: 0
  end
end

1個目のテストではページネーションの表示と1ページ目に表示されているユーザー(管理者ユーザー以外)に「削除」リンクが表示されていることを確認。
プラス、@non_adminのユーザーを削除してユーザー数が1減ることも確認。

2個目のテストでは管理者権限をもたないユーザーがログインした場合は「削除」リンクが表示されていないことを確認。

うーん、説明読みながらなら解読はできるかな。。。

最後にテストを実行してテストが通ることを確認。

$ bundle exec rake test
40 tests, 152 assertions, 0 failures, 0 errors, 0 skips

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

次は「9.5 最後に」から。

9章の演習が迫ってきた…!