Ruby on rails 由于唯一性验证,工厂机器人无法创建

Ruby on rails 由于唯一性验证,工厂机器人无法创建,ruby-on-rails,rspec,factory-bot,Ruby On Rails,Rspec,Factory Bot,型号 class User < ApplicationRecord has_many :tokens, :dependent => :destroy class Profile < ApplicationRecord belongs_to :user belongs_to :token class Token < ApplicationRecord belongs_to :user 工厂。rb FactoryBot.d

型号

  class User < ApplicationRecord
      has_many :tokens, :dependent => :destroy

  class Profile < ApplicationRecord
    belongs_to :user
    belongs_to :token

  class Token < ApplicationRecord
    belongs_to :user
工厂。rb

FactoryBot.define do

  factory :user do
    sequence(:email) { |n| "person#{n}@example.com" }
    password {'blablabla'}
  end

  factory :token do
    association :user, factory: :user
    refresh_token {"XXXXX"}
  end

  factory :profile do
    association :user, factory: :user
    association :token, factory: :token
  end
end

首先,有一种更简单的方法来定义关联:

FactoryBot.define do
工厂:用户做什么
顺序(:email){n|“person{n}@example.com”}
密码{'blabla'}
结束
工厂:代币
用户
刷新令牌{“XXXXX”}
令牌类型{'bearer'}
结束
工厂名称:profile do
用户
代币
结束
结束
接下来,如果您想在测试中使用与另一个记录关联的现有记录,您有两个选项

选项1-创建令牌并让它为您生成关联的用户:

token=create:token
user=token.user
选项2-您可以在创建令牌时传入关联的记录:

user=create:user
令牌=创建:令牌,用户:用户

首先,有一种更简单的方法来定义关联:

FactoryBot.define do
工厂:用户做什么
顺序(:email){n|“person{n}@example.com”}
密码{'blabla'}
结束
工厂:代币
用户
刷新令牌{“XXXXX”}
令牌类型{'bearer'}
结束
工厂名称:profile do
用户
代币
结束
结束
接下来,如果您想在测试中使用与另一个记录关联的现有记录,您有两个选项

选项1-创建令牌并让它为您生成关联的用户:

token=create:token
user=token.user
选项2-您可以在创建令牌时传入关联的记录:

user=create:user
令牌=创建:令牌,用户:用户

我只想使用
电子邮件{FFaker::Internet.safe_email}
(添加FFaker gem),这将为您提供更好的测试数据,并让您花时间做一些更好的事情,然后调试一个序列,我会考虑这些问题。问题是我不想有两个不同的用户。它应该指的是同一个用户。我只会使用
电子邮件{FFaker::Internet.safe_email}
(添加FFaker gem),这将为您提供更好的测试数据,并让您花时间做一些更好的事情,然后调试一个序列,这类问题困扰着您。好的,我会考虑。问题是我不想有两个不同的用户。它应该引用同一个用户。
FactoryBot.define do

  factory :user do
    sequence(:email) { |n| "person#{n}@example.com" }
    password {'blablabla'}
  end

  factory :token do
    association :user, factory: :user
    refresh_token {"XXXXX"}
  end

  factory :profile do
    association :user, factory: :user
    association :token, factory: :token
  end
end
  factory :profile do
    user

    after(:create) do |profile, evaluator|
      create(:token, profile: profile)
    end
  end