Функциональный тест на способность CanCan не работает - PullRequest
0 голосов
/ 22 января 2012

Я пытаюсь проверить способность CanCan в моем приложении, которое также использует Authlogic. Я проверил правильное поведение при работе с реальным сайтом, но я хочу написать функциональный тест, который предупредит меня, если это поведение прекратится в будущем. Мой файл способностей прост и выглядит следующим образом:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new

    can :read, User
    can :manage, User, :id => user.id
    cannot :create, User
    can :destroy, UserSession

    if user.role? :guest
      can :create, UserSession
      cannot :destroy UserSession
    end
  end
end

Мой тест для UserSessionsController также прост и выглядит следующим образом:

test "should redirect new for member" do
  default_user = login :default_user

  assert default_user.role? :member
  assert_raise(CanCan::AccessDenied) { get :new }
  assert_redirected_to root_path
end

Просто для справки, мой test_helper.rb выглядит так:

ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'authlogic/test_case'

class ActiveSupport::TestCase
  fixtures :all
  setup :activate_authlogic

  def login(user_login)
    UserSession.create users(user_login)
    users(user_login)
  end
end

Когда я запускаю свой код, мой тест не проходит, однако:

test_should_redirect_new_for_member                                  FAIL
        CanCan::AccessDenied expected but nothing was raised.
        Assertion at test/functional/user_sessions_controller_test.rb:13:in `block in <class:UserSessionsControllerTest>'

Если я закомментирую assert_raise, утверждение перенаправления также не будет выполнено. Кто-нибудь видит что-то не так с моим кодом, что приводит к сбою этого теста?

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Проблема заключалась в том, что я спасал AccessDenied в моем ApplicationController, поэтому исключение никогда не возникало.

0 голосов
/ 01 марта 2012

Вам также необходимо заблокировать новое действие.

if !(user.role? :member)
 can :new, User
end

Может быть Пользователь с ролью «участник» имеет доступ к новому действию (отображаемая форма для пользователя) и ограниченный доступ к действию создания.

И еще одна вещь, нам не нужно использовать

cannot [:any_action], [Model]

Мы можем сделать все самим can.

...