ruby-on-rails 铁路工厂女孩得到“电子邮件已采取”

2ledvvac  于 2023-03-24  发布在  Ruby
关注(0)|答案(6)|浏览(203)

这是我的factory girl代码,每次我尝试生成评论时,它都告诉我“Email has already been taken”,我已经重置了我的数据库,将spec_helper中的transition设置为true,但仍然没有解决这个问题。我是新手,我是否使用了错误的关联?谢谢!

Factory.define :user do |user|
  user.name                  "Testing User"
  user.email                 "test@example.com"
  user.password              "foobar"
  user.password_confirmation "foobar"
end

Factory.define :course do |course|
  course.title "course"
  course.link "www.umn.edu"
  course.sections 21
  course.description "test course description"
  course.association :user
end

Factory.define :review do |review|
  review.title "Test Review"
  review.content "Test review content"
  review.association :user
  review.association :course
end
bpsygsoo

bpsygsoo1#

我知道这是一个很老的问题,但是公认的答案已经过时了,所以我想我应该发布新的方法。

FactoryGirl.define do
  sequence :email do |n|
    "email#{n}@factory.com"
  end

  factory :user do
    email
    password "foobar"
    password_confirmation "foobar"
  end
end

来源:文件
它相当简单,这很好。

iyfamqjs

iyfamqjs2#

您需要使用序列来防止创建具有相同电子邮件的用户对象,因为您必须在User模型中验证电子邮件的唯一性。

Factory.sequence :email do |n|
  “test#{n}@example.com”
end

Factory.define :user do |user|
  user.name "Testing User"
  user.email { Factory.next(:email) }
  user.password "foobar"
  user.password_confirmation "foobar"
end

您可以在Factory Girl documentation中阅读更多内容。

cbwuti44

cbwuti443#

除了上面的答案,您可以添加gem 'faker'到您的宝石文件,它将提供独特的电子邮件。

FactoryGirl.define do
  factory :admin do
    association :band
    email { Faker::Internet.email }
    password "asdfasdf"
    password_confirmation "asdfasdf"
  end
end
cld4siwp

cld4siwp4#

sequence提供真正独特的电子邮件和Faker提供随机密码。

FactoryGirl.define do
  sequence :email do |n|
    "user#{n}@test.com"
  end

  factory :user do
    email
    password { Faker::Internet.password(min_length: 8, max_length:20) }
    password_confirmation { "#{password}" }
  end
end
kr98yfug

kr98yfug5#

由于某种原因,password_confirmation字段对我不起作用。起作用的是:

FactoryBot.define do

  sequence :email do |n|
    "user#{n}@test.com"
  end

  factory :user do
    email
    password { Faker::Internet.password(min_length: 8, max_length:20) }
    confirmed_at { Time.current } # <---- This worked for me
  end
end

请注意,如果您没有使用Faker,您可以使用像`password {“password”}这样简单的东西来代替那一行。

zu0ti5jz

zu0ti5jz6#

1.你需要添加一个序列
1.(可选)如果你经常在rails控制台中执行工厂,你可以添加一些随机性Random.hex(4),否则你会遇到同样的问题。

FactoryBot.define do
  factory :user do
    sequence(:email) do |index|
      "test_#{Random.hex(4)}#{index}@fake-domain.xyx"
    end
  end
end

相关问题