这是我非常简单的能力课程:
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
但那是在我使用cancan之前,并且手动检查用户是否具有某个角色。这种行为发生在应用程序控制器中,因此非常容易模拟。我在嘲笑这个能力课时遇到了困难:(
我想在不同的背景下嘲笑它。我感到有点迷茫,因为即使我这样做了:
expect(Ability).to receive(:asdasdadskjadawd?).at_least(:once)
没有引起任何错误,但是如果我拼写了&#39; Ability&#39;这是错误的,所以它嘲笑班级好......
答案 0 :(得分:0)
我不认为你应该嘲笑Ability
类,特别是在控制器测试中。 Ability
类更像是配置而不是代码;在申请期间它不会改变。它也是控制器不应该关心的实现细节。
相反,你应该嘲笑你的Users
。看起来你正在使用FactoryGirl;您可以使用FactoryGirl's traits来模拟您拥有的各种用户:
FactoryGirl.define do
factory :user do
name 'Bob'
email 'bob@example.com
role 'user'
trait :admin do
role 'admin'
end
trait :guest do
role 'guest'
end
end
end
如果您需要普通用户,则可以使用FactoryGirl.create :user
;如果您的测试需要管理员,则可以使用FactoryGirl.create :user, :admin
。