1

Rspec を使用して Pundit ポリシー スコープをテストする際に問題が発生しています。基本的に、スコープで返される値がユーザーに厳密に制限されていることをテストしようとしています。したがって、ユーザーに対して返されたすべての問題を循環し、ID がユーザーと同じであることを確認します。

これは緑色ですが、スコープ呼び出しが問題オブジェクトを返すだけであるため、非市民の役割の場合は失敗します。各ロールには .where() のスコープがあるため、これは大したことではありませんが、何か間違ったことをしている可能性があるコードの匂いです。

アクションを実行する IssueController があります

class IssuePolicy < ApplicationPolicy
  class Scope < Struct.new(:user, :scope)
    def resolve
      if user.role == 'citizen'
       scope.where(:user_id => user.id)
     else
       scope
     end
   end
end

これをrspecでテストするには、これを行う必要がありました

require 'spec_helper'

describe IssuePolicy do

  before(:each) do
    @user = FactoryGirl.create(:user)
    @issue = FactoryGirl.create(:issue)
    @last_issue = FactoryGirl.create(:issue, user_id: User.last.id + 1)
  end

  context "for a citizen" do
    before(:each) do
      @user.update(role: 'citizen')
    end
    it "should only return their posts on index action" do
     @p = IssuePolicy::Scope.new(@user, Issue).resolve
     @p.each do |issue|
       expect{issue.user_id}.to eql(@user.id)
     end
   end
  end
end
4

1 に答える 1

4

さて、掘り下げて、ドキュメントを通じてこの質問をテストする方法と、調査を通じてスコープを実行する方法を見つけました。

irb> IssuePolicy::Scope.new(@user, Issue.all).resolve.class 

これは ActiveRecord::QueryMethods::WhereChain を返します

したがって、次の質問は、これの構造または動作をテストするかどうかです。スコープが適切に適用されているかどうかだけを気にしているので、動作をテストすることにしました。したがって、上記の範囲テストは私にとっては問題ありません。追加のヘルパーとして、従業員の役割のみがアクセスでき、市民の役割が拒否されることをテストした方法を次に示します。誰かの助けになることを願っています。

「spec_helper」が必要

describe IssuePolicy do
  subject { IssuePolicy }


  permissions :index?, :show?, :create?, :new?, :update?, :edit?, :destroy? do
    it "denies access to citizen" do
      expect(subject).not_to permit(FactoryGirl.create(:user, role: 'citizen'), Issue.create())
    end

    it "allows access to employee" do
      expect(subject).to permit(FactoryGirl.create(:user, role: 'employee'), Issue.create())
    end
  end


end
于 2014-05-05T01:39:58.293 に答える