为什么我的工厂测试会引发另一个工厂的错误?
Why my factory test raises an error from another factory?
我对 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
如果有更好的做法或者只是告诉我我缺少什么,我将不胜感激。谢谢!
您的用户模型中必须有一个验证,以防止您使用数据库中已有的电子邮件 and/or 用户名创建用户。当你有一个工厂(favorite
)时,它会尝试创建一个用户和一个游戏,而不首先检查用户电子邮件 and/or 用户名是否已经存在,它会失败,因为它使用你设置的值它们总是相同的(“test@gmail.com”,“test”,相应地)。
您可以为此使用 FactoryBot sequence:
sequence :email do |n|
"test#{n}@gmail.com"
end
sequence :username do |n|
"test-#{n}"
end
这会阻止您对新记录使用相同的值,因为 sequence
会产生一个增量整数,因此只要测试套件运行,该值就不会相同。
我对 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
如果有更好的做法或者只是告诉我我缺少什么,我将不胜感激。谢谢!
您的用户模型中必须有一个验证,以防止您使用数据库中已有的电子邮件 and/or 用户名创建用户。当你有一个工厂(favorite
)时,它会尝试创建一个用户和一个游戏,而不首先检查用户电子邮件 and/or 用户名是否已经存在,它会失败,因为它使用你设置的值它们总是相同的(“test@gmail.com”,“test”,相应地)。
您可以为此使用 FactoryBot sequence:
sequence :email do |n|
"test#{n}@gmail.com"
end
sequence :username do |n|
"test-#{n}"
end
这会阻止您对新记录使用相同的值,因为 sequence
会产生一个增量整数,因此只要测试套件运行,该值就不会相同。