【问题标题】:Factory Bot fails to create due to uniqueness validation由于唯一性验证,Factory Bot 无法创建
【发布时间】:2020-10-21 11:55:56
【问题描述】:

模型

  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. 创建一个 id=1、user_id=2 的 Token

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

测试

it 'test' do
  create(:profile)
end

工厂.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

【问题讨论】:

  • 我只会使用email { FFaker::Internet.safe_email }(添加 ffaker gem),它会给你更好的测试数据,让你花时间做更好的事情,然后调试一个序列,恕我直言,这些问题充斥着这些问题.
  • 好的,我会考虑的。问题是我不想有两个不同的用户。它应该指向同一个用户。

标签: ruby-on-rails rspec factory-bot


【解决方案1】:
  factory :profile do
    user

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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2015-05-26
      • 2020-06-22
      • 2015-03-23
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      相关资源
      最近更新 更多