Простой ответ: используйте factory.sequence
Если у вас есть поле, которое должно быть уникальным, вы можете добавить последовательность в factory_girl, чтобы убедиться, что она никогда не будет прежней:
Factory.define :user do |user|
sequence(:email){|n| "user#{n}@factory.com" }
user.password{ "secret" }
end
Это будет увеличиваться n
каждый раз, чтобы создать уникальный адрес электронной почты, такой как `user52@factory.com. (Подробнее см. https://github.com/thoughtbot/factory_girl/wiki/Usage)
Однако это не всегда здорово в Rails.env.development ...
Со временем я обнаружил, что это на самом деле не самый полезный способ создания уникальных адресов электронной почты. Причина в том, что хотя фабрика всегда уникальна для вашей тестовой среды, она не всегда уникальна для вашей среды разработки и n
сбрасывается при запуске среды вверх и вниз. В :test
это не проблема, потому что база данных стерта, но в :development
вы сохраняете тенденцию к определенным данным на некоторое время.
Затем вы сталкиваетесь с коллизиями и обнаруживаете, что вынуждены вручную переписать письмо на что-то, что, как вы знаете, является уникальным и раздражающим.
Часто более полезно: используйте случайное число
Поскольку я регулярно звоню u = Factory :user
из консоли, я вместо этого генерирую случайное число. Вы не гарантированно избежите столкновений, но на практике это почти никогда не случается:
Factory.define :user do |user|
user.email {"user_#{Random.rand(1000).to_s}@factory.com" }
user.password{ "secret" }
end
N.B. Вы должны использовать Random.rand
вместо rand () из-за столкновения (ошибка?) В FactoryGirl [https://github.com/thoughtbot/factory_girl/issues/219](see здесь).
Это освобождает вас от необходимости создавать пользователей из командной строки независимо от того, есть ли уже созданные пользователем фабричные пользователи в базе данных.
Дополнительная опция для упрощения тестирования электронной почты
Когда вы начинаете тестирование электронной почты, вы часто хотите убедиться, что действие определенного пользователя вызвало отправку электронного письма другому пользователю.
Вы авторизуетесь как Robin Hood
, отправляете электронное письмо на Maid Marion
и затем входите в свой почтовый ящик, чтобы проверить это. То, что вы видите в своем почтовом ящике, это что-то из user_842@factory.com
. Кто это, черт возьми?
Вам нужно вернуться в свою базу данных, чтобы проверить, было ли электронное письмо отправлено / получено кем бы вы ни ожидали. Опять это немного больно.
Вместо этого мне нравится генерировать электронную почту, используя имя фабричного пользователя в сочетании со случайным числом. Это значительно упрощает проверку того, от кого что-то происходит (а также делает столкновения невероятно маловероятными). Используя гем Faker (http://faker.rubyforge.org/) для создания имен, которые мы получаем:
Factory.define :user do |user|
user.first_name { Faker::Name::first_name }
user.last_name { Faker::Name::last_name }
user.email {|u| "#{u.first_name}_#{u.last_name}_#{Random.rand(1000).to_s}@factory.com" }
end
наконец, поскольку Faker иногда генерирует имена, которые не подходят для электронной почты (Майк О'Доннелл), нам нужно внести в белый список допустимые символы: .gsub(/[^a-zA-Z1-10]/, '')
Factory.define :user do |user|
user.first_name { Faker::Name::first_name }
user.last_name { Faker::Name::last_name }
user.email {|u| "#{u.first_name.gsub(/[^a-zA-Z1-10]/, '')}_#{u.last_name.gsub(/[^a-zA-Z1-10]/, '')}_#{Random.rand(1000).to_s}@factory.com" }
end
Это дает нам привлекательные, но уникальные электронные письма, такие как robin_hood_341@factory.com
и maid_marion_10@factory.com