ruby-on-rails – FactoryBot和Faker – 独特无效
发布时间:2020-12-17 03:08:02 所属栏目:百科 来源:网络整理
导读:我正在使用FactoryBot和Faker进行测试,看起来Faker正在生成相同的名称: class Profile ApplicationRecord belongs_to :user validates_presence_of :first_name,:last_name,:nickname validates :nickname,uniqueness: { case_sensitive: false }endFactory
我正在使用FactoryBot和Faker进行测试,看起来Faker正在生成相同的名称:
class Profile < ApplicationRecord belongs_to :user validates_presence_of :first_name,:last_name,:nickname validates :nickname,uniqueness: { case_sensitive: false } end FactoryBot.define do factory :user do sequence(:email) { |n| "user#{n}@example.org" } password "123456" trait :with_profile do profile end end end FactoryBot.define do factory :profile do first_name Faker::Name.unique.first_name last_name Faker::Name.unique.last_name nickname { "#{first_name}_#{last_name}".downcase } user end end RSpec.feature "Friendships",type: :feature do scenario "User can accept a pending friendship request" do @tom = create(:user,:with_profile) @jerry = create(:user,:with_profile) #other stuff end end 即使我使用的是独特的方法,我也会收到错误 ActiveRecord::RecordInvalid: Validation failed: Nickname has already been taken`. 有线索吗? 解决方法
应该:
first_name { Faker::Name.unique.first_name } last_name { Faker::Name.unique.last_name } 加载Faker :: Name.unique.first_name时将进行评估.因此,使用块. 编辑: FactoryBot.define do factory :profile do first_name Faker::Name.unique.first_name end end 在此示例中,Faker :: Name.unique.first_name将在工厂定义期间(加载/需要文件时)进行一次评估.如果它找到一个唯一值,比如’John Doe’,它将被用于该工厂创建的每个项目. 或者换句话说:在加载文件并评估Faker :: Name.unique.first_name后,您可能会认为这个工厂好像是: FactoryBot.define do factory :profile do first_name 'John Doe' end end 使用块时 – 每次调用create(:profile)或build(:profile)时,都会评估块的主体.每次调用块内的Faker :: Name.unique.first_name部分,并返回不同的唯一结果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |