答案很簡單:使用factory.sequence
如果您有必須是唯一的,你可以在factory_girl添加順序,以確保它是絕不相同的字段:
Factory.define :user do |user|
sequence(:email){|n| "user#{n}@factory.com" }
user.password{ "secret" }
end
這將每次增加n
,以便生成一個唯一的電子郵件地址,例如`[email protected]。 (更多信息請參見https://github.com/thoughtbot/factory_girl/wiki/Usage)
然而,這並不總是Rails.env.development偉大的...
隨着時間的推移,我發現,這是不實際,創造出獨特的最有效的方法電子郵件地址。原因在於,雖然工廠對於您的測試環境而言始終是獨一無二的,但它並不總是與您的開發環境相獨立,並且在您向上和向下啓動環境時重置自身。在:test
這不是問題,因爲數據庫已被擦除,但在:development
中,您保持趨向於相同的數據一段時間。
然後你得到衝突,並發現自己不得不手動覆蓋電子郵件給您知道的東西是獨特的這是煩人。
經常更有用:使用隨機數
因爲我定期去我用,而不是產生一個隨機數調用u = Factory :user
從控制檯。你不能保證避免衝突,但在實踐中幾乎從未發生:
Factory.define :user do |user|
user.email {"user_#{Random.rand(1000).to_s}@factory.com" }
user.password{ "secret" }
end
注:您必須使用Random.rand
而不是rand(),因爲FactoryGirl中的碰撞(錯誤?)[https://github.com/thoughtbot/factory_girl/issues/219](see here]。
這使您可以從命令行隨意創建用戶,無論數據庫中是否存在工廠生成的用戶。
製作電子郵件測試可選的額外容易
當你進入電子郵件測試你經常要驗證特定用戶的操作觸發的電子郵件給其他用戶。
您以Robin Hood
的身份登錄,發送電子郵件至Maid Marion
,然後轉至您的收件箱進行驗證。您在收件箱中看到的內容是[email protected]
。這到底是誰?
您需要返回數據庫以檢查電子郵件是否由您期望的發送/接收。這又是一個痛苦。
我喜歡做的是使用Factory用戶名和一個隨機數生成電子郵件。這使得更容易檢查來自哪些事物(並且也使得碰撞不可能)。使用法克爾寶石(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
最後,由於法克爾有時產生未電子郵件友好(邁克·奧唐奈),我們需要接受白名單字符的名稱:.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]
我也有這個問題。您是否在電子郵件字段中添加了序列,因此理論上每次調用Factory(:user)時都會更改。我有這個問題,並且仍然遇到你有問題。 – someoneinomaha
我有同樣的問題。我注意到FactoryGirl在我的測試數據庫中留下了一些不好的數據,這些數據來自於一個早期的測試失敗,可能會引發異常(可能會避免清理)。我通過這樣做來修復它: RAILS_ENV =測試bin/rake db:drop RAILS_ENV =測試bin/rake db:希望這可以幫助@someoneinomaha – Joel