簡體   English   中英

Rails Pundit Rspec測試

[英]Rails Pundit Rspec testing

我在用Rspec測試Pundit策略范圍時遇到了麻煩。 基本上,我試圖測試范圍內返回的值嚴格限於用戶。 因此,我循環瀏覽為用戶返回的所有問題,並確保ID等於用戶。

這是綠色的,但是當它是非公民角色時,由於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

好吧,他們也進行了一些挖掘,發現了如何通過文檔測試這個問題,然后如何通過研究確定范圍。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM