2015-08-01 4 views
3

Я пытаюсь запустить сильные тесты параметров для моей модели Restaurant, и я столкнулся с ошибкой, которая не развивается в процессе разработки. В своем контроллере у меня есть метод канкан load_and_authorize_resource разрешить только администраторам создавать, обновлять и уничтожать эти модели экземпляров:Обход CanCan :: AccessDenied во время работы RSpec тестов

class RestaurantsController < ApplicationController 
    load_and_authorize_resource param_method: :restaurant_params, find_by: :slug 
    ... 
end 

Когда дело доходит до выполнения тестов, хотя я получаю ошибку:

1) RestaurantsController should permit POST #create to receive parameters :name 
    Failure/Error: should permit(:name). 
    CanCan::AccessDenied: 
     You are not authorized to access this page. 

Есть ли простой способ обойти эту авторизацию? Я все время смотрел, и, похоже, нет четкого ответа.

Тест

describe RestaurantsController do 
    let(:user) { FactoryGirl.create(:user, admin: true) } 

    it { should permit(:name).for(:create) } 
end 

Примечание: Я принял взглянуть на docs над на канкан, и они говорят, чтобы создать экземпляр пользователя с его атрибутом админ, установленным в действительности. Даже с этим я все еще немного запутался в том, как вставить этого пользователя в мой тест.

ответ

0

После некоторых исследований я пришел к выводу, что лучший способ обойти это больше связано с лесозаготовок в мой User завод по более Devise, чем иметь дело с самой CanCanCan камень.

В зависимости от вашей настройки это может различаться, но для моей фабрики пользователей у меня есть свой атрибут admin, установленный на true.

user.rb

FactoryGirl.define do 
    factory :user do 
    first_name "John" 
    last_name "Doe" 
    email "[email protected]" 
    password "password" 
    admin true 
    end 
end 

Затем я создал подкаталог внутри моей spec папки support и следовал примеру в ссылке DEViSE при условии, чтобы создать соответствующий метод модуля для входа в системе пользователя:

спецификации/поддержка/controller_macros.rb

module ControllerMacros 
    def login_admin 
    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:admin] 
     sign_in FactoryGirl.create(:user) 
    end 
    end 
end 

Затем в моем файле rails_helper я просто расширил этот модуль, чтобы использовать метод login_admin. Что пример Devise DID NOT упоминалось, что вам нужно было requirecontroller_macros файл в этом помощнике. Это может быть воспринято некоторыми, но потенциально может быть недооценено, если не будете осторожны:

спецификации/rails_helper.rb

ENV['RAILS_ENV'] ||= 'test' 
require 'spec_helper' 
require File.expand_path('../../config/environment', __FILE__) 
require 'rspec/rails' 
require 'support/controller_macros' 

ActiveRecord::Migration.maintain_test_schema! 

RSpec.configure do |config| 
    .... 
    config.include Devise::TestHelpers, type: :controller 

    config.extend ControllerMacros, type: :controller 
end 

Наконец в тестах контроллера просто применить метод login_admin везде, где это необходимо:

Ресторан контроллер Тесты

describe RestaurantsController do 
    login_admin 

    it { should permit(:name).for(:create) } 
end 
2

Я обходил cancan's load_and_authorize_resource, звоню со следующим, так как я намерен тестировать способности отдельно.

before { allow_any_instance_of(CanCan::ControllerResource).to receive(:load_and_authorize_resource){ nil } } 
+0

Это правильный способ сделать это, на мой взгляд. – Sean

Смежные вопросы