gpt4 book ai didi

ruby-on-rails - 为什么我的工厂测试会引发另一家工厂的错误?

转载 作者:行者123 更新时间:2023-12-04 07:20:52 24 4
gpt4 key购买 nike

我对 Rspec 和 factory_bot 很陌生。我有以下工厂:

FactoryBot.define do
factory :user do
email { "test@gmail.com" }
password { "azerty" }
username { "test" }
city { "Paris"}
end

factory :game do
title { "Mega Man X" }
nostalgia_point { 9 }
platform { "Super Nintendo" }
developer { "Capcom" }
release_date { Date.new(1994,1,1) }
game_mode { "Single player" }
genre { ["Adventure", "Platform", "Shooter"] }
association :owner, factory: :user
end

factory :favorite do
user
game
end
end
当我运行此测试时:
require 'rails_helper'

RSpec.describe Game, type: :model do
let!(:favorite) { create(:favorite) }

describe '::create' do
context 'persistence' do
it 'persists the favorite' do
expect(Favorite.count).to eq(1)
end
end
end
end
我收到以下错误: ActiveRecord::RecordInvalid: Validation failed: Email has already been taken, Username has already been taken我猜是因为我的 user工厂(设计模型)没有从我的其他测试中清除,但我绝对不确定......而且我不知道我是否应该使用与我所做的不同的东西来清理我的所有数据库。这是我在 factory_bot.rb 中写的内容:
RSpec.configure do |config|
config.include Warden::Test::Helpers

config.after :each do
Warden.test_reset!
end

config.include FactoryBot::Syntax::Methods
end
如果有更好的做法或只是告诉我我缺少什么,我将不胜感激。谢谢!

最佳答案

您的用户模型中必须有一个验证,以防止您使用数据库中已有的电子邮件和/或用户名创建用户。并且由于您有一个工厂( favorite ),它尝试创建用户和游戏,而没有先检查用户电子邮件和/或用户名是否已经存在,它会失败,因为它使用了您为它们设置的值,即始终相同(“test@gmail.com”,“test”,相应地)。
您可以使用 FactoryBot sequence为了那个原因:

sequence :email do |n|
"test#{n}@gmail.com"
end
sequence :username do |n|
"test-#{n}"
end
这会阻止您对新记录使用与 sequence 相同的值。产生一个增量整数,因此只要测试套件运行,该值就可以保证不相同。

关于ruby-on-rails - 为什么我的工厂测试会引发另一家工厂的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68512761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com