Ruby on rails 大型测试套件中的Rspec/FactoryGirl唯一性验证

Ruby on rails 大型测试套件中的Rspec/FactoryGirl唯一性验证,ruby-on-rails,rspec,factory-bot,Ruby On Rails,Rspec,Factory Bot,使用Rspec和FactoryGirl,如果我有一个工厂使用序列自动递增一个特征,并且在某些规格中,如果我显式地设置这个特征,使用足够大的测试套件,有时随机规格会失败 Validation failed: uniq_id has already been taken 工厂的定义如下: factory :user { sequence(:uniq_id) {|n| n + 1000} } create(:user, uniq_id: 5555) 我猜这个验证失败是因为在我的测试套件中的一个地

使用Rspec和FactoryGirl,如果我有一个工厂使用序列自动递增一个
特征
,并且在某些规格中,如果我显式地设置这个特征,使用足够大的测试套件,有时随机规格会失败

Validation failed: uniq_id has already been taken
工厂的定义如下:

factory :user { sequence(:uniq_id) {|n| n + 1000} }
create(:user, uniq_id: 5555)
我猜这个验证失败是因为在我的测试套件中的一个地方,我生成了这样一个用户:

factory :user { sequence(:uniq_id) {|n| n + 1000} }
create(:user, uniq_id: 5555)
而且,大概因为factory girl在套件中生成了4555个以上的用户,验证失败了

我试图通过将
uniq\u id
转换为55555(更大的数字)来避免这个问题,因此没有干扰。但有更好的解决办法吗?我的
spec\u helper
包括以下相关位:

config.use_transactional_fixtures = true

config.after(:all) do
  DatabaseCleaner.clean_with(:truncation)
end

我有时也会这样。我没有找到任何解释,但只会发生在大量数据中。我让别人找到了解释

发生这种情况时,您可以这样声明属性(下面是使用
faker
gem的示例):


我能够在我的工厂解决我的问题(基于@gotva在问题评论中的建议)


我认为你可以在工厂女孩回访中解决你的问题。例如,您可以在(:build)回调之后检查
中的唯一性值,如果存在具有该值的其他用户,则再次触发
序列
。@gotva这听起来是一个很好的解决方案。您能否在(:build)
之后发布
的答案和示例代码?我不知道如何在块中使用序列,他们的文档也不清楚。@gotva实际上已经解决了这个问题,而且效果很好。非常感谢。添加作为答案,这样我就可以接受并给你所有的分数。对不起,我现在没有机会测试factory girl-所以我恐怕我会给出错误的代码。我给了你这个想法,你实现了它——将结果作为答案发布,然后自己接受;)