由于唯一性验证,Factory Bot 无法创建

Factory Bot fails to create due to uniqueness validation

型号

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

  class Profile < ApplicationRecord
    belongs_to :user
    belongs_to :token

  class Token < ApplicationRecord
    belongs_to :user

当我调用配置文件的创建时,它会执行以下操作:

  1. 创建 ID=1、user_id=1、token_id=1
  2. 的配置文件
  3. 创建一个id=1的令牌,user_id=2

所以我用 iD=2 创建了另一个用户,但它应该是相同的 user_id=1 如果我尝试删除序列(:电子邮件),它 returns 用户电子邮件唯一性的验证错误。

测试

it 'test' do
  create(:profile)
end

Factories.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

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

  factory :token do
    user
    refresh_token {"XXXXX"}
    token_type {'bearer'}
  end

  factory :profile do
    user
    token
  end
end

接下来,如果您想在测试中使用另一条记录关联中的现有记录,您有两种选择。

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

token = create :token
user = token.user

选项 2 - 您可以在创建令牌时为关联传递一条记录:

user = create :user
token = create :token, user: user
  factory :profile do
    user

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