使用Rspec和FactoryGirl,如果我有一个使用序列自动增加trait
的工厂,并且在某些规范中,如果我使用足够大的测试套件显式设置此特征,有时随机规格会失败
Validation failed: uniq_id has already been taken
工厂定义如下:
factory :user { sequence(:uniq_id) {|n| n + 1000} }
我猜这个验证失败了,因为在我的测试套件中的一个地方,我生成了这样一个用户:
create(:user, uniq_id: 5555)
因为大概是工厂女孩在套件上产生了超过4,555名用户,验证失败了吗?
我试图通过将uniq_id
转换为55555(更大的数字)来避免此问题,因此没有干扰。但是有更好的解决方案吗?我的spec_helper
包含以下相关内容:
config.use_transactional_fixtures = true
config.after(:all) do
DatabaseCleaner.clean_with(:truncation)
end
答案 0 :(得分:1)
有时会发生在我身上。我没有找到任何解释,但只有大量的数据才会发生。我让别人找到解释!
当它发生时,您可以像这样声明您的属性(这是使用faker
gem的示例):
FactoryGirl.define do
factory :user do
login do
# first attempt
l = Faker::Internet.user_name
while User.exists?(:login => l) do
# Here is a loop forcing validation
l = Faker::Internet.user_name
end
l # return login
end
end
end
答案 1 :(得分:1)
我能够在我的工厂解决这个问题(基于@ gotva在问题评论中提出的建议)。
factory :user do
sequence(:uniq_id) { |n| n + 1000 }
# increment again if somehow invalid
after(:build) do |obj|
if !obj.valid? && obj.errors.keys.include?(:uniq_id)
obj.uniq_id +=1
end
end
end