簡體   English   中英

Rails RSpec測試Factorybot返回符號

[英]Rails rspec testing factorybot returning symbol

我想看看用戶是否有權訪問我的應用程序中的某些頁面。 為此,我使用rSpecFactoryBot作為我的燈具替換。

我有兩個工廠,一個用於具有has_many用戶的role ,一個用於belongs_to一個roleuser

角色工廠

FactoryBot.define do
  factory :role do
    trait :admin do
      role_name 'admin'
    end
  end

  factory :admin, traits: [:admin]
end

用戶工廠

FactoryBot.define do
  factory :user do

    association :role, factory: :admin
  end
end

我正在使用Pundit進行Authorizatin,而使用Pundit Matchers來測試Pundit策略。

需要'rails_helper'

describe AccountPolicy do
  subject { described_class.new(user, account) }
  let (:account) { Account.create }

  context 'being an admin' do
    let(:user) { User.create(role: :admin) }

    it { is_expected.to permit_action([:index]) }
  end
end

上面是編寫策略,以查看作為管理員的用戶是否可以訪問“帳戶”索引。 運行rake ,出現以下錯誤。

ActiveRecord::AssociationTypeMismatch:
Role(#70284397401400) expected, got :admin which is an instance of Symbol(#70284363589400)

我看到類型不匹配。 但是,我不確定如何將角色作為活動記錄對象返回,我認為這是它從其外觀(而不是符號)中所期望的。 我該如何實現?

我認為您的問題的一部分在於您的體系結構,但我將在底部解決。

let(:user) { User.create(role: :admin) }

這試圖將角色屬性設置為符號:admin。 而您想傳遞一個實際的管理員角色對象/記錄。

let(:admin_role) { Role.create(:admin) }
let(:user) { User.create(role: admin_role) }

但是,您當前的用戶工廠將角色工廠設置為管理工廠。 因此,默認情況下,所有創建的用戶均為管理員。 您將需要在FactoryBot上進行更多閱讀,以構建工廠,以便更輕松地創建某些類型的用戶。 向用戶模型添加特征以創建正確的角色將有助於您當前的體系結構。

出於好奇,如果用戶只能擁有一個角色,為什么還要使用一個單獨的表? 為什么不使用User上的enum列?

暫無
暫無

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

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