【114日目】【1日20分のRailsチュートリアル】【第9章】ユーザー削除のテストを追加する
今日は「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章の演習が迫ってきた…!