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

时间:2015-02-26 09:54:47

标签: ruby-on-rails rspec factory-bot

使用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

2 个答案:

答案 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