2016-03-22 6 views
2

のRails:4.2 評論家:1.0.1Pundit Headless Policyをテストするにはどうすればよいですか?

ヘッドレスポリシーをテストするための戦略は何ですか?私がREADMEの例で与えられたDSLを使うと、私はスコープに関する問題にぶつかります。

AdminPolicy:

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: "[email protected]", [...], 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) 

答えて

0

質問を投稿した後、#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 
関連する問題