2017-09-21 4 views
0

Je la politique suivanteRspec & essai Pundit-Matchers autorisation interdit

module Admin 
    class PostPolicy < AdminPolicy 

    def index? 
     true 
    end 

    def show? 
     scope.where(:id => record.id).exists? && user.present? && user == record.user 
    end 

    def create? 
     true 
    end 

    def update? 
     user.present? && user == record.user 
    end 

    def destroy? 
     user.present? && user == record.user 
    end 

    def delete? 
     destroy? 
    end 

    end 
end 

et j'utilise la gemme pundit-matchers d'écrire des tests rspec.

RSpec.describe Admin::PostPolicy do 

    subject { described_class.new(user, [:admin, post]) } 
    let(:user) { FactoryGirl.create(:user) } 

    context 'permit authorization' do 
    let(:post) { FactoryGirl.create(:post, user_id: user.id) } 

    it { is_expected.to permit_action(:edit) } 
    it { is_expected.to permit_action(:delete) } 
    end 

    context 'deny authorization' do 
    let(:post) { FactoryGirl.create(:post, user_id: user.id + 1) } 

    it { is_expected.to forbid_action(:edit) } 
    it { is_expected.to forbid_action(:delete) } 
    end 
end 

Les tests sur permit authorization sont verts, mais lorsque je tente de tester la deny authorization je reçois l'erreur suivante

ActiveRecord::RecordInvalid: 
     Validation failed: User must exist 

Comment puis-je résoudre ce problème, afin d'obtenir le test vert? La logique est qu'un utilisateur est autorisé à modifier et supprimer ses propres messages et les utilisateurs de ne pas d'autres

Répondre

0

Le test échoue, car l'ID d'utilisateur spécifié ici:

let(:post) { FactoryGirl.create(:post, user_id: user.id + 1) } 

est pas valide - Je suppose dans votre modèle de poste que vous avez un poste appartient à l'utilisateur, et clairement utilisateur: user.id + 1 n'existe pas.

Il suffit de faire

let(:post) { FactoryGirl.create(:post) } 

Pour provoquer un nouvel utilisateur à créer avec poste.