我有一个测试,我将一个类“ClassA”存根。我希望Cancancan的load_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;
答案 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)
顺便说一句,如果某人有其他选择,请发布。