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