Rails rspec 测试 factorybot 返回符号

Rails rspec testing factorybot returning symbol

我想查看用户是否有权访问我的应用程序中的某些页面。为此,我使用 rSpecFactoryBot 作为我的灯具替换。

我有两个工厂,一个为 role has_many 用户和一个 user belongs_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 进行授权,使用专家匹配器 gem 测试专家策略。

需要'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)

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

我认为你的部分问题出在你的架构上,但我会在底部解决。

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

这试图将角色属性设置为符号 :admin。而您想传递一个实际的管理员角色 object/record.

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

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

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