2014-04-05 3 views
0

Rspec으로 Pundit 정책 범위를 테스트하여 문제가 있습니다. 기본적으로, 나는 범위에서 반환 된 값이 엄격하게 사용자에게 제한되어 있는지 테스트하려고합니다. 그래서 나는 사용자를 위해 반환 된 모든 문제를 검토하고 ID가 사용자와 동일한 지 확인하십시오.Rails Pundit Rspec testing

녹색이지만 이슈 개체를 반환하는 범위 호출로 인해 비 시민 역할 인 경우 실패합니다. 이것은 각 역할이 .where()와 함께 범위를 가질 것이기 때문에 큰 문제는 아니지만, 나는 어떤 일을하고 있을지도 모르는 코드 냄새입니다.

나는 내가 확실히이

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 

답변

3

을해야했다

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에이를 테스트하기위한 조치 그래서 뒷조사를했고 통해이 질문을 테스트하는 방법을 발견을 수행하는 IssueController이 문서화 한 다음 연구를 통해 범위를 수행하는 방법에 대해 설명합니다.

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

이 제품은 액티브 :: 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 
을 필요로