`raise_record_invalid` 在 Rails 中将 FactoryBot 与 Rspec 结合使用
`raise_record_invalid` using FactoryBot with Rspec in Rails
我正在使用 FactoryBot
为我的 Rspec 测试创建虚假数据。我厂给用户的情况如下:
FactoryBot.define do
factory :user do
sequence(:name) { |n| "User#{n}" }
sequence(:email) { |n| "user#{n}@email.com" }
end
end
创建用户会在我的 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)
创建接受的客户端和用户。我不确定此时需要更改什么
To my defence, I am not so experienced with the FactoryBot.
您在 user = FactoryBot.create(:user)
中使用了 create
,它将在您的数据库中创建记录,因此当您尝试创建相同的记录时,您将得到错误。
- Read this for getting more info
- check this too
执行以下操作
- 杀死你的服务器,这样你就不会遇到有人在使用你的数据库
- 运行
rails db:setup
- 运行
rails db:setup RAILS_ENV=test
注:全部
rails db:setup
versions 将帮助您重置数据库和 运行 您的种子文件(如果有的话)。
希望我的解释对您开始研究和了解更多有所帮助 ;)
我知道这个问题很老,但我喜欢使用不同的解决方案,a.k.a。 Faker gem.
的 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 >
我正在使用 FactoryBot
为我的 Rspec 测试创建虚假数据。我厂给用户的情况如下:
FactoryBot.define do
factory :user do
sequence(:name) { |n| "User#{n}" }
sequence(:email) { |n| "user#{n}@email.com" }
end
end
创建用户会在我的 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)
创建接受的客户端和用户。我不确定此时需要更改什么
To my defence, I am not so experienced with the FactoryBot.
您在 user = FactoryBot.create(:user)
中使用了 create
,它将在您的数据库中创建记录,因此当您尝试创建相同的记录时,您将得到错误。
- Read this for getting more info
- check this too
执行以下操作
- 杀死你的服务器,这样你就不会遇到有人在使用你的数据库
- 运行
rails db:setup
- 运行
rails db:setup RAILS_ENV=test
注:全部
rails db:setup
versions 将帮助您重置数据库和 运行 您的种子文件(如果有的话)。
希望我的解释对您开始研究和了解更多有所帮助 ;)
我知道这个问题很老,但我喜欢使用不同的解决方案,a.k.a。 Faker gem.
的 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 >