Используйте последовательность фабрики для генерации уникальных телефонных номеров

Я новичок в 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 ответа

Решение

Попробуйте использовать лямбду со случайным 10-значным числом:

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

Попробуй это:

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) }

Чтобы завершить ответ @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

Хотя случайное решение работает, у вас есть небольшой шанс не получить уникальный номер. Я думаю, что вы должны использовать FactoryGirl sequence,

Мы можем начать с 1 000 000 000 (100 000 000) и увеличивать их. Примечание. Это дает только 98 999 999 999 уникальных телефонных номеров, которых должно быть достаточно. Если нет, у вас есть другие проблемы.

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

  factory :user do
    phone_number
  end
end
Другие вопросы по тегам