3

我是 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

4 回答 4

7

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

phone_number { rand(10**9..10**10) } 
于 2013-09-15T15:44:48.113 回答
5

尝试这个:

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) }
于 2013-09-13T20:34:23.927 回答
2

要完成@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
于 2017-07-06T15:10:34.693 回答
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
于 2014-04-21T01:36:27.410 回答