2014-09-04 4 views
0

Вот мой очень простой класс способность:Mock способность класса

class Ability 
    include CanCan::Ability 

    def initialize(user) 
     if user.has_role? :admin 
      can :manage, :control_panel 
     end 
    end 
end 

Как я должен дразнить его в контроллер спецификации?

Вот мой управления контроллер панели:

class Admin::ControlPanelController < ApplicationController 
    authorize_resource class: false 

    rescue_from CanCan::AccessDenied do |exception| 
     redirect_to root_url, danger: "#{exception}" 
    end 

    def statistics 
    end 
end 

Вот мой control_panel контроллер спецификации:

describe '#statistics:' do 
    let(:request){ get :statistics } 

    context 'When guest;' do 
     before do 
      # HOW SHOULD I MOCK HERE? 
     end 

     describe 'response' do 
      subject { response } 

      its(:status){ should eq 302 } 
      its(:content_type){ should eq 'text/html' } 
      it{ should redirect_to root_path } 
     end 

     describe 'flash' do 
      specify { expect(flash[:danger]).to eq "You do not have sufficient priviledges to access the admin area. Try logging in with an account that has admin priviledges." } 
     end 
    end 

Как я должен издеваться способность? Раньше я делал это:

let(:user){ FactoryGirl.create :user } 
expect(controller).to receive(:current_user).and_return user 
expect(user).to receive(:has_role?).with(:admin).and_return false 

, но это было до того я использовал канкан и вручную проверить, что пользователь имел определенную роль. Такое поведение происходило в контроллере приложений, поэтому было очень легко насмехаться. Я с трудом издевательского этого класса способности :(

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

expect(Ability).to receive(:asdasdadskjadawd?).at_least(:once) 

не поднимаются нет ошибок, хотя один поднимается, если я заклинание «Способность» неправильно, так что это насмешливое класс ок ...

ответ

0

Я не думаю, что вы должны быть насмешливый Ability класс, особенно не в тесте контроллера. в Ability класс больше похожа на конфигурацию, чем на код, она не меняется во время вашего приложения. n, что контроллер не должен заботиться.

Вместо этого вы должны насмехаться над своим Users. Похоже, вы используете FactoryGirl; вы могли бы использовать FactoryGirl's traits издеваться различными видами пользователей у вас есть:

FactoryGirl.define do 
    factory :user do 
    name 'Bob' 
    email '[email protected] 
    role 'user' 

    trait :admin do 
     role 'admin' 
    end 

    trait :guest do 
     role 'guest' 
    end 
    end 
end 

Вы можете использовать FactoryGirl.create :user, если вам нужен регулярный пользователь, и FactoryGirl.create :user, :admin если тест требует администратора.

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