Cancancanを使っているときのtest


Cancancanとは?

この記事を見て下さっているということは既にご存知だと思いますが、 権限管理のgem です。

Cancancanを使っているときのテストはどうしたらいいのか?

権限があるときは、権限を持つテストユーザーでログインして

test "test#indexにmanager権限を持つユーザーがアクセスして、正常レスポンスが返されること" do
  # manager権限を持つユーザーでログイン
  login(:yama_p)

  get tests_path
  assert_response :success
end

正常に処理ができることを確認すればまぁいいかも知れませんが、 アクセスできない(権限がない)ことを確認する にはどうしたらよいでしょうか?
というのも、上記で assert_response :errors などとしてもcancancanで弾かれたときにエラーが返ってくるわけではなくそもそもアクセスできないので

CanCan::AccessDenied: You are not authorized to access this page.

とテストが落ちてしまいます。

権限を持つかどうかをテストする

Cancancanのwikiにテストについての記述があります。

test "test#indexにmember権限を持つユーザーはアクセス権限を持たないこと" do
  # member権限を持つユーザー
  user = users('fan_bingbing')
  ability = Ability.new(user)
  assert ability.cannot?(:manage, Test.new)
end

上記のような感じで、ユーザーが権限を持たないことをテストすればOK!