Ruby on rails 模仿能力班
这是我非常简单的能力课程:Ruby on rails 模仿能力班,ruby-on-rails,rspec,cancan,Ruby On Rails,Rspec,Cancan,这是我非常简单的能力课程: class Ability include CanCan::Ability def initialize(user) if user.has_role? :admin can :manage, :control_panel end end end 我应该如何在控制器规范中模拟它 这是我的控制面板控制器: class Admin::ControlPanelController <
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
我该如何嘲笑这种能力?以前,我是这样做的:
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)
没有引发错误,尽管如果我拼写“Ability”错误,会引发一个错误,因此它是在模拟类ok…我认为您不应该模拟Ability
类,尤其是在控制器测试中。Ability
类更像配置,而不是代码;它在应用程序期间不会更改。它也是一个简单的类控制器不应该关心的心理状态细节
相反,你应该模仿你的用户
。看起来你在使用FactoryGirl;你可以用它来模仿你拥有的各种类型的用户:
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
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