代码之家  ›  专栏  ›  技术社区  ›  anonn023432

`raise\u record\u invalid`在Rails中使用带Rspec的FactoryBot

  •  1
  • anonn023432  · 技术社区  · 7 年前

    我正在使用 FactoryBot 为我的Rspec测试创建虚假数据。我的用户工厂如下:

    FactoryBot.define do
      factory :user do
        sequence(:name) { |n| "User#{n}" }
        sequence(:email) { |n| "user#{n}@email.com" }
      end
    end
    

    创建用户在my中自动创建客户端 User 作为后续操作的模型:

    def initialize_client
      self.client = self.build_client
      self.client.setup_stripe
      self.save
    end 
    

    我为客户设立了一个工厂:

    FactoryBot.define do
      factory :client do
        user
      end
    end
    

    我创建了一个Rspec文件来测试 client 在将用户创建为以下用户时正确生成:

    describe User, type: :model do
      user = FactoryBot.create(:user)
    end
    

    但这会产生错误:

    raise_record_invalid': Validation failed: Email has already been taken (ActiveRecord::RecordInvalid)
    

    即使跑步 FactoryBot.create(:user) 创建接受的客户端和用户。我不确定我现在需要改变什么

    2 回复  |  直到 7 年前
        1
  •  1
  •   Kick Buttowski    7 年前

    为我辩护,我对FactoryBot没有那么多经验。

    您已使用 create 在里面 user = FactoryBot.create(:user) ,它将在数据库中创建记录,因此当您尝试创建相同的记录时,您将得到错误。

    1. Read this for getting more info
    2. check this too

    执行以下操作

    1. 杀死你的服务器,这样你就不会遇到有人在使用你的数据库
    2. rails db:setup
    3. rails db:setup RAILS_ENV=test

    注:全部

    rails db:设置

    版本将帮助您重置数据库并运行种子文件(如果有)。

    希望我的解释能帮助你开始 正在研究 并了解更多;)

        2
  •  0
  •   Jason Noble    5 年前

    我知道这个问题由来已久,但我喜欢使用不同的解决方案,即 Faker::Internet 伪造宝石的一部分。

    FactoryBot.define do
      factory :user do
        name { Faker::Name.name }
        email { Faker::Internet.safe_email(name: name) }
      end
    end
    
    2.5.7 :013 > user = FactoryBot.build(:user)
     => #<User:0x00007fb93a19f690 @name="Warner Hayes", @email="warner.hayes@example.net">
    2.5.7 :014 > user = FactoryBot.build(:user)
     => #<User:0x00007fb938ddadf8 @name="Basil Smitham", @email="smitham_basil@example.com">
    2.5.7 :015 > user = FactoryBot.build(:user)
     => #<User:0x00007fb938de16a8 @name="Mr. Winfred Daugherty", @email="daugherty.mr.winfred@example.com">
    2.5.7 :016 > user = FactoryBot.build(:user)
     => #<User:0x00007fb939bd2168 @name="Elodia Bartell PhD", @email="bartell.elodia.phd@example.com">
    2.5.7 :017 >