【问题标题】:RSpec and CanCan Controller TestingRSpec 和 CanCan 控制器测试
【发布时间】:2010-12-20 15:32:02
【问题描述】:

我在一个项目中使用 RSpec 和 CanCan。我正在与能力类相关的规范中测试我的权限逻辑。对于控制器,我真的只是想确保我正在进行授权检查。我设置了一个控制器宏,但它似乎无法正常工作。

所以我真的有两个问题。一,该策略是否足以测试我的控制器的权限逻辑(或者我应该更多地测试控制器授权逻辑)?

二,有没有人看到我做错了什么使这不起作用?

#plan_orders_controller.rb
def approve
  plan_order = PlanOrder.find(params[:id])
  authorize! :update, plan_order
  current_user.approve_plan_order(plan_order)
  redirect_to plan_order_workout_plan_url(plan_order)
end

#controller_macros.rb
def it_should_check_permissions(*actions)
  actions.each do |action|
    it "#{action} action should authorize user to do this action" do
      @plan_order = Factory(:plan_order, :id=>1)
      ability = Object.new
      ability.extend(CanCan::Ability)
      controller.stub!(:current_ability).and_return(ability)        

      get action, :id => 1
      ability.should_receive(:can?)
    end
  end    
end

我从 RSpec 得到的输出如下

 Failure/Error: ability.should_receive(:can?)
 (#<Object:0x00000006d4fa20>).can?(any args)
     expected: 1 time
     received: 0 times
 # ./spec/controllers/controller_macros/controller_macros.rb:27:in `block (2 levels) in it_should_check_permissions'

我不确定当我在控制器中调用 !authorize 时应该检查哪个方法(或者它是通过 load_and_authorize_resource 自动调用的)

【问题讨论】:

    标签: ruby-on-rails-3 rspec2 cancan


    【解决方案1】:

    should_receive 是对未来发生的事情的期望。将这两行颠倒过来:

    get action, :id => 1
    ability.should_receive(:can?)
    

    所以你有这个:

    ability.should_receive(:can?)
    get action, :id => 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2013-01-28
      • 1970-01-01
      相关资源
      最近更新 更多