Rails rspec 测试 factorybot 返回符号
Rails rspec testing factorybot returning symbol
我想查看用户是否有权访问我的应用程序中的某些页面。为此,我使用 rSpec
和 FactoryBot
作为我的灯具替换。
我有两个工厂,一个为 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 作为角色?为什么不在用户上使用枚举列?
我想查看用户是否有权访问我的应用程序中的某些页面。为此,我使用 rSpec
和 FactoryBot
作为我的灯具替换。
我有两个工厂,一个为 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 作为角色?为什么不在用户上使用枚举列?