【问题标题】:How to test a Pundit Headless Policy?如何测试 Pundit Headless Policy?
【发布时间】:2016-03-22 03:29:17
【问题描述】:

导轨:4.2 权威人士:1.0.1

测试无头策略的策略是什么?当我使用 README 示例中给出的 DSL 时,我遇到了范围界定问题。

管理政策:

class AdminPolicy < ApplicationPolicy

  def initialize user, resource
    @user = user
    @resource = resource
  end

  def manage_any?
    user.present? && user.system_admin_role?
  end
end

rspec:

require 'rails_helper'

describe AdminPolicy do

  subject { described_class }

  context "limited_user" do
    let(:user)     { create :user }
    let(:resource) { nil }

    permissions :show? do
      it { is_expected.to_not permit :manage_any?, resource }
    end
  end

end

错误输出:

  1) AdminPolicy limited_user show? should not permit #<User id: 2380, email: "first1.last1@test.gov", [...], system_admin_role: false> and :manage_any?
     Failure/Error: scope.where(id: resource.id).exists?

     NameError:
       undefined local variable or method `scope' for #<AdminPolicy:0x007fae12e2f618>
     # ./app/policies/application_policy.rb:25:in `show?'
     # /Users/mwlang/.rvm/gems/ruby-2.1.5/gems/pundit-1.0.1/lib/pundit/rspec.rb:15:in `public_send'
     # /Users/mwlang/.rvm/gems/ruby-2.1.5/gems/pundit-1.0.1/lib/pundit/rspec.rb:15:in `block (3 levels) in <module:Matchers>'
     # /Users/mwlang/.rvm/gems/ruby-2.1.5/gems/pundit-1.0.1/lib/pundit/rspec.rb:15:in `each'
     # /Users/mwlang/.rvm/gems/ruby-2.1.5/gems/pundit-1.0.1/lib/pundit/rspec.rb:15:in `find_all'
     # /Users/mwlang/.rvm/gems/ruby-2.1.5/gems/pundit-1.0.1/lib/pundit/rspec.rb:15:in `block (2 levels) in <module:Matchers>'
     # ./spec/policies/admin_policy_spec.rb:13:in `block (4 levels) in <top (required)>'

Finished in 0.41901 seconds (files took 2.02 seconds to load)

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 pundit


    【解决方案1】:

    发布问题后,首先意识到#scope 是如何被调用的。

    permissions 块是用:show? 定义的,应该用:manage_any? 定义,这是我真正想测试的上下文。结果,我实际上是从调用范围的 ApplicationPolicy 调用 :show?

    resource 在这种无头上下文中同样不需要,因此请消除它。我们剩下以下内容:

    require 'rails_helper'
    
    describe AdminPolicy do
    
      subject { described_class }
    
      context "limited_user" do
        let(:user)          { create :user }
        let(:system_admin)  { create :user, system_admin_role: true }
    
        permissions :manage_any? do
          it { is_expected.to_not permit user }
          it { is_expected.to     permit system_admin }
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 2014-04-21
      • 1970-01-01
      • 2014-05-18
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      相关资源
      最近更新 更多