康康康模拟 load_and_authorize_resource
cancancan mock load_and_authorize_resource
我有一个测试,其中存根 class "ClassA"。我希望 Cancancan's 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)
does not load the @classA object, as is supposed to
或者,使用 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: undefined method `responds_like' for Mocha::ClassMethods::AnyInstance:0x00000006dfe958>
如果看一看 implementation, it ends up calling find_resource,它使用适配器模式来查找合适的实例。
我通过打桩 active_record class 查找方法让它工作,请注意 cancancan 也有一个 find_by 方法,但在我的例子中它只是打桩查找。
首先你应该存根授权,它可以有很大的不同,在我的例子中,授权是:
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)
顺便说一下,如果有人有替代品,请post它。
我有一个测试,其中存根 class "ClassA"。我希望 Cancancan's 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)
does not load the @classA object, as is supposed to
或者,使用 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: undefined method `responds_like' for Mocha::ClassMethods::AnyInstance:0x00000006dfe958>
如果看一看 implementation, it ends up calling find_resource,它使用适配器模式来查找合适的实例。
我通过打桩 active_record class 查找方法让它工作,请注意 cancancan 也有一个 find_by 方法,但在我的例子中它只是打桩查找。
首先你应该存根授权,它可以有很大的不同,在我的例子中,授权是:
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)
顺便说一下,如果有人有替代品,请post它。