使用工厂的序列生成唯一的电话号码

时间:2013-09-13 20:28:38

标签: ruby-on-rails rspec tdd sequence factories

我是TDD,RSpec和工厂的新手,并试图了解如何测试每个用户的电话号码属性是否唯一。为此,我正在尝试在用户工厂中使用序列。我对以下内容并不感兴趣:

FactoryGirl.define do
  factory :user do
    number = 123456789
    sequence(:phone_number) {|n| (number + n).to_s }
  end
end

有关实现此目标的最佳方法的任何想法?此外,对于这样的事情,哪种测试有意义,最终我想将以下验证添加到用户模型以进行此类测试?

validates :phone_number, :uniqueness => true

谢谢!

4 个答案:

答案 0 :(得分:7)

尝试使用带有随机10位数字的lambda:

phone_number { rand(10**9..10**10) } 

答案 1 :(得分:2)

试试这个:

FactoryGirl.define do
  sequence :phone_number do |n|
     "123456789#{n}"
  end

  factory :user do
    phone_number
  end
end

并且为了测试您的验证,请在user_spec中使用它

it { should validate_uniqueness_of(:phone_number) }

答案 2 :(得分:0)

虽然随机解决方案有效,但您获得唯一号码的可能性很小。我认为你应该利用FactoryGirl sequence

我们可以从1,000,000,000(100-000-000)开始增加。注意:这只能为您提供98,999,999,999个unqiue电话号码,这应该足够了。如果没有,你还有其他问题。

FactoryGirl.define do
  sequence :phone_number do |n|
    num = 1*(10**8) + n
    num.to_s
  end

  factory :user do
    phone_number
  end
end

答案 3 :(得分:0)

要完成@westonplatter答案,要从0 000 000 000开始,您可以使用String#rjust

FactoryGirl.define do
  factory :user do
    sequence(:phone_number) {|n| n.to_s.rjust(10, '0') }
  end
end

示例:

> 10.times { |n| puts n.to_s.rjust(10, '0') }
0000000000
0000000001
0000000002
0000000003
0000000004
0000000005
0000000006
0000000007
0000000008
0000000009