【问题标题】:Rails rspec testing factorybot returning symbolRails rspec测试factorybot返回符号
【发布时间】:2018-04-02 00:00:04
【问题描述】:

我想查看用户是否有权访问我的应用程序中的某些页面。为此,我使用rSpecFactoryBot 作为我的固定装置替代品。

我有两个工厂,一个用于rolehas_many 用户,一个用于userbelongs_to 一个role

角色工厂

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 进行授权,并使用 Pundit Matchers gem 来测试 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)

我发现我遇到了类型不匹配。但是,我不确定如何将角色作为活动记录对象返回,我认为这是它的外观所期望的,而不是符号。我怎样才能做到这一点?

【问题讨论】:

    标签: ruby-on-rails rspec factory-bot pundit


    【解决方案1】:

    我认为你的部分问题在于你的架构,但我会在底部解决这个问题。

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

    这是试图为符号 :admin 设置角色属性。而您想传入一个实际的管理员角色对象/记录。

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

    但是,您当前的用户工厂将角色工厂设置为管理员工厂。因此,默认情况下,所有创建的用户都是管理员。您需要更多地阅读 FactoryBot 来构建您的工厂,以便更轻松地创建某些类型的用户。将特征添加到用户模型以创建正确的角色将有助于您当前的架构。

    出于好奇,如果用户只能拥有一个角色,为什么还要为角色使用单独的表格?为什么不在用户上使用枚举列?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多