如何在控制器能力测试中加载load_and_authorize_resource?

时间:2014-02-25 11:03:56

标签: ruby-on-rails rspec cancan

我在测试中有这个:

let(:ability) { Object.new.extend(CanCan::Ability) }

...
describe "GET show" do
  it 'redirects to root if havent read ability' do
    allow(@controller).to receive(:current_ability).and_return(ability)
    ability.cannot :read, Book
    get :show, { id: '1'}
    response.should redirect_to(root_url)
  end
...

在控制器中我有来自cancan的load_and_authorize_resource,当测试运行时,它尝试从id = 1的数据库中获取记录。我只需要测试authorize_resource,而不是加载。

我通过在调用get:

之前在控制器中设置实例变量来修复它
@controller.instance_variable_set('@author', true) # to skip load_resource

但这不是完美的决定。这是一种更好的方法来跳过加载并仅使用load_and_authorize_resource检查控制器中测试能力的authorize_resource吗?

1 个答案:

答案 0 :(得分:2)

看起来像

allow_any_instance_of(CanCan::ControllerResource).to receive(:load_resource)

工作正常