cancancan mock load_and_authorize_resource

时间:2017-03-20 21:18:15

标签: ruby-on-rails mocha cancancan

我有一个测试,我将一个类“ClassA”存根。我希望Cancancanload_and_authorize_resource加载我的存根对象,而不是从数据库中提取它。

class ClassAController < ApplicationController
 load_and_authorize_resource :classa
end 

我尝试了mocha的不同方式,但没有成功

CanCan::ControllerResource.any_instance.stubs(:load_and_authorize_resource).returns(@stubbed_classA)
  

不加载@classA对象,应该加载

或者,使用responds_like

  @stubb_classA = stub(...)
  ...
  class MOCKING
    def self.load_and_authorize_resource!
      @classa = @stubb_classA 
      returns true 
    end
  end

  CanCan::ControllerResource.any_instance.responds_like(MOCKING)
  

NoMethodError:未定义的方法`responds_like'用于Mocha :: ClassMethods :: AnyInstance:0x00000006dfe958&gt;

1 个答案:

答案 0 :(得分:0)

如果看一下implementation,它最终会调用find_resource,它使用适配器模式来查找适当的实例。

我通过存根一个active_record类的find方法让它工作,请注意cancancan也有一个find_by方法,但在我的情况下,它只使用了stubs find。

首先你应该是存根授权,它可以有很大的不同,在我的情况下,授权是:

ability.rb

can :manage, ClassA do |w|
 w.user_workspaces.exists?(admin: true, user: user)  
end 

所以,因为cancancan要求对象进行授权,所以存根应该是

 @stubbed_object.user_workspaces.stubs(:exists?).with(:admin => true, :user =>@user).returns(true) 

最后,查找发现者

#make ClassA return a stubbed object.
ClassA.stubs(:find).with(@stubbed_object.id).returns(@stubbed_object) 

顺便说一句,如果某人有其他选择,请发布。