康康康模拟 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它。