Написание спецификации для устройства RegistrationsController, которое гарантирует, что пользователи не смогут изменить свою роль - загадочное сообщение об ошибке - PullRequest
0 голосов
/ 31 декабря 2011

У меня есть приложение rails 3.1, использующее Devise и CanCan для управления пользователями и ролями. Я хочу убедиться, что пользователи могут обновить свой пароль, но не свои роли. (Таким образом, обычные пользователи не могут назначить себя администратором). Я переопределил класс Devise "RegistrationsController" с помощью следующего кода:

def update
  # this is my attempt to stop people from updating their roles
  # and giving themselves "Admin" priveledges.
  params.delete("role_ids")
  super 
end

Я надеюсь, что это помешает хакерам обновить поле "role_ids" в пользователе, чтобы изменить свои привилегии. (Если есть лучший способ добиться этого, скажите, пожалуйста!) Моя проблема в том, что я не могу написать спецификацию, которая проверит работоспособность этого кода. Моя спецификация выглядит так:

require 'spec_helper'

describe RegistrationsController do

    before (:each) do
      @user = Factory(:user)
      sign_in @user
    end

    it "should update the user attributes but not the roles" do
      user_params = {"name" => "new_name", "role_ids" => ["2"],}
      put :update, { :id => @user.id, :user  => user_params}
      @user = User.find(@user.id)
      @user.name.should == "new_name"
      @user.roles.should be_empty
    end
end

Проблема в том, что этот тест не выполняется. Я получаю сообщение об ошибке, подобное этому:

Failures:

  1) RegistrationsController should update the user attributes but not the roles
     Failure/Error: put :update, { :id => @user.id, :user  => user_params}
     AbstractController::ActionNotFound:
       Could not find devise mapping for path "/user?id=29&user%5Bname%5D=new_name&user%5Brole_ids%5D%5B%5D=2".
       Maybe you forgot to wrap your route inside the scope block? For example:

           devise_scope :user do
             match "/some/route" => "some_devise_controller"
           end
     # ./spec/controllers/registrations_controller_spec.rb:13:in `block (2 levels) in <top (required)>'

Я не понимаю, что сообщение об ошибке просит меня сделать. Мои маршруты кажутся хорошими, и мое приложение, кажется, работает иначе. Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 25 января 2012

Попробуйте это в настройках

@request.env ["devise.mapping"] = Devise.mappings [: пользователь]

Подробнее см. Как: тестирование контроллеров и представлений с помощью Rails 3

...