【问题标题】:FactoryGirl Email already takenFactoryGirl 电子邮件已被占用
【发布时间】:2017-06-14 23:35:48
【问题描述】:

我正在尝试用 FactoryGirl 实例化多个对象(拥有唯一电子邮件的客人)

  guests = create_list(:guest, 3)

但我得到错误:

 Failure/Error: guests = create_list(:guest, 3)

 ActiveRecord::RecordInvalid:
   Validation failed: Email has already been taken

这里是我的工厂:

FactoryGirl.define do
  factory :guest do
    email Faker::Internet.unique.email
    firstname 'John'
    lastname  'Doe'
    password 'test'
    password_confirmation 'test'

    factory :guest_with_bookings do
      email "#{SecureRandom.hex}@test.com"
      transient do
        bookings_count 2
      end
      after(:create) do |guest, evaluator|
        create_list(:booking, evaluator.bookings_count, guests: [guest])
      end
    end
  end
end

即使使用 Faker::Internet.unique.email,当我尝试创建超过 1 个访客时它也不起作用

【问题讨论】:

  • 似乎答案是“sequence :email do |n| "person#{n}@example.com" end" 但我不明白
  • 您是否在测试运行之间清除数据库?
  • @sergey-mell 提供了很好的答案,但实际上您只是忘记使用 block email { each_time_code } 所以代码 "#{SecureRandom.hex}@test.com" 执行了 one 时间并且factory 每次都尝试使用相同的固定电子邮件创建来宾。

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


【解决方案1】:

在您的工厂中使用序列

FactoryGirl.define do
  factory :guest do
    sequence(:email) { |n| "name_#{n}@example.com" }

或与Faker结合

FactoryGirl.define do
  factory :guest do
    sequence(:email) { |n| Faker::Internet.unique.email("Nancy_#{n}") }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多