由于唯一性验证,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
当我调用配置文件的创建时,它会执行以下操作:
- 创建 ID=1、user_id=1、token_id=1
的配置文件
- 创建一个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
型号
class User < ApplicationRecord
has_many :tokens, :dependent => :destroy
class Profile < ApplicationRecord
belongs_to :user
belongs_to :token
class Token < ApplicationRecord
belongs_to :user
当我调用配置文件的创建时,它会执行以下操作:
- 创建 ID=1、user_id=1、token_id=1 的配置文件
- 创建一个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