Ответ 1
Простой ответ: используйте 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...
Со временем я обнаружил, что это не самый полезный способ создания уникальных адресов электронной почты. Причина в том, что, хотя factory всегда уникален для вашей тестовой среды, он не всегда уникален для вашей среды разработки, а 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 здесь).
Это освобождает вас от необходимости создавать пользователей из командной строки независимо от того, есть ли в базе данных уже factory сгенерированные пользователи.
Дополнительно для упрощения проверки электронной почты
Когда вы проходите тестирование электронной почты, вы часто хотите проверить, что действие определенного пользователя вызвало электронное письмо другому пользователю.
Войдите в систему как Robin Hood
, отправьте электронное письмо на адрес Maid Marion
, а затем перейдите в свой почтовый ящик, чтобы проверить его. То, что вы видите в своем почтовом ящике, есть что-то от [email protected]
. Кто это, черт возьми?
Вам нужно вернуться в свою базу данных, чтобы проверить, было ли отправлено/получено электронное письмо тем, кем вы ожидали. Опять это немного боль.
Вместо этого я хотел бы создать электронное письмо, используя имя пользователя factory в сочетании со случайным числом. Это значительно упрощает проверку того, что происходит (а также делает конфликты исчезающе маловероятными). Используя камень 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
Это дает нам персонифицированные, но уникальные электронные письма, такие как [email protected]
и [email protected]