Използвайте фабрична последователност, за да генерирате уникални телефонни номера

Нов съм в 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

Благодаря!


person dougiebuckets    schedule 13.09.2013    source източник


Отговори (4)


Опитайте да използвате ламбда с произволно 10-цифрено число:

phone_number { rand(10**9..10**10) } 
person candiman    schedule 15.09.2013
comment
Това няма да гарантира, че ще получите уникален телефонен номер. Приема се, че е много малко вероятно, но във всеки случай е по-добра практика да сте сигурни, като използвате последователности, както посочи drekyau. - person Sean; 13.10.2016

Опитайте тази:

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) }
person derekyau    schedule 13.09.2013
comment
1. validate_uniqueness_of това е метод на скъпоценен камък 'shoulda-matchers'. 2. не забравяйте, че трябва да създадете запис в тази таблица преди такъв тест (rubydoc.info/github/thoughtbot/shoulda-matchers/master/Shoulda/) - person gotva; 14.09.2013
comment
Благодаря, @gotva е напълно прав, че трябва да съответства и че трябва да се уверите, че сте ги включили. Въпреки това, не се нуждаете от db запис, за да изпълните този съпоставител, тъй като той просто потвърждава, че по същество правилните линии са във вашия модел. - person derekyau; 14.09.2013
comment
Благодаря момчета. Добавих 'shoulda-matchers'. Въпреки това, когато всъщност добавя валидирането към модела (т.е. „валидира :phone_number, :uniqueness =› true“), тестът все още се проваля. някакви мисли? - person dougiebuckets; 14.09.2013
comment
можете ли да поставите някакъв код, който имате във вашия model/user_spec? може би същността - person derekyau; 14.09.2013
comment
Дадено. Трябва да отбележа, че добавянето на валидирането на уникалността всъщност кара всичките ми тестове да се провалят сега. Ето го: gist.github.com/dougiebuckets/6556159 - person dougiebuckets; 14.09.2013
comment
Неуспех/Грешка: {трябва да потвърди_уникалността_на(:телефонен_номер)} NoMethodError: недефиниран метод „първи“ за String:Class - person dougiebuckets; 14.09.2013
comment
странно... може ли 1) да се уверите, че shoulda-matchers е инсталиран (защита за рестартиране), а също и какво причинява „първия“ проблем? Мога ли да видя и вашата фабрика? Ако изтриете всичко в user_spec с изключение на съвпадението на shoulda, работи ли? - person derekyau; 14.09.2013
comment
Мога да потвърдя, че трябва да съвпада е инсталиран и да рестартирам защитата. Относно „първия“ проблем, нямате представа? Това нещо от shoulda-matcher ли е? Ако изтрия всичко освен 'it { should validate_uniqueness_of(:phone_number) }' пак получавам грешката. „Ето фабриката: gist.github.com/dougiebuckets/6556518 Наистина оценявам вашата помощ - person dougiebuckets; 14.09.2013
comment
опитайте да преместите последователността извън фабричния :user блок, както актуализирах в отговора си по-горе - person derekyau; 14.09.2013
comment
Благодаря. Опитах това и все още получавам онзи странен „недефиниран метод „първи“ за String:Class“ - person dougiebuckets; 14.09.2013
comment
Според документацията shoulda-matchers се опитва да създаде запис в таблици users без проверка User.new.save(validation => false) и това може да е източникът на проблема. Предлагам 1. Опитайте да повторите този код (User.new.save...) във вашата конзола - имате ли същата грешка? 2. опитайте се да прочетете стека на грешката в тестовете - обикновено той съобщава къде във вашето APP е повдигнат проблемът. 3. създайте сами запис в DB gist.github.com/gotva/6565446 - person gotva; 15.09.2013
comment
Ако ви интересува дължината на телефонния номер, това решение няма да работи, когато поредният номер надхвърли едноцифрено число - person Toby 1 Kenobi; 24.09.2018

За да завършите отговора на @westonplatter, за да започнете от 0 000 000 000, можете да използвате Низ#rпросто:

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
person mdemolin    schedule 06.07.2017

Докато произволното решение работи, имате малък шанс да не получите уникален номер. Мисля, че трябва да използвате 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
person westonplatter    schedule 21.04.2014