Тестирование Rails Pundit Rspec

Я сталкиваюсь с трудностями при тестировании областей политики Pundit с помощью Rspec. По сути, я пытаюсь проверить, что возвращаемые значения в области строго ограничены пользователем. Поэтому я перебираю все вопросы, возвращаемые пользователю, и проверяю, что идентификатор равен пользователю.

Это зеленый, но не работает, когда он не является гражданином, из-за вызова Scope, только возвращающего объект Issue. Это не имеет большого значения, так как каждая роль будет иметь видимость с.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

1 ответ

Решение

Хорошо, так что некоторые копали и выяснили, как проверить этот вопрос с помощью документации, а затем, как сделать объемы исследований.

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
Другие вопросы по тегам