代码之家  ›  专栏  ›  技术社区  ›  Trenton Tyler

Rails rspec testing factorybot返回符号

  •  0
  • Trenton Tyler  · 技术社区  · 7 年前

    我想看看用户是否有权访问我的应用程序中的某些页面。为此,我使用 rSpec FactoryBot 作为我的固定装置更换。

    我有两个工厂,一个用于 role 哪一个 has_many 用户和 user 那个 belongs_to 角色

    角色工厂

    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测试权威政策。

    需要“rails\u 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)
    

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   Tyler Ferraro    7 年前

    我认为您的部分问题存在于您的体系结构中,但我将在底部解决这个问题。

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

    这正在尝试将角色属性设置为符号:admin。而您希望传入实际的管理员角色对象/记录。

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

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

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

    推荐文章