2011-04-05 29 views
12

這是我的工廠女孩​​的代碼,並且每次我嘗試生成審查,它告訴我「電子郵件已被採取」,我已重置我的數據庫,將spec_helper中的轉換設置爲true,但仍未解決問題。我是新手,我是否使用關聯錯誤?謝謝!鐵軌工廠女孩得到「電子郵件已被採取」

Factory.define :user do |user| 
    user.name     "Testing User" 
    user.email     "[email protected]" 
    user.password    "foobar" 
    user.password_confirmation "foobar" 
end 

Factory.define :course do |course| 
    course.title "course" 
    course.link "www.umn.edu" 
    course.sections 21 
    course.description "test course description" 
    course.association :user 
end 

Factory.define :review do |review| 
    review.title "Test Review" 
    review.content "Test review content" 
    review.association :user 
    review.association :course 
end 

回答

11

你需要使用一個序列,以防止用戶對象的創建與相同的電子郵件,因爲你必須有電子郵件在您的用戶模型中的唯一性驗證。

Factory.sequence :email do |n| 
    「test#{n}@example.com」 
end 

Factory.define :user do |user| 
    user.name "Testing User" 
    user.email { Factory.next(:email) } 
    user.password "foobar" 
    user.password_confirmation "foobar" 
end 

你可以在Factory Girl documentation瞭解更多。

+0

非常感謝,解決了問題! – randomor 2011-04-05 06:05:12

33

我知道這是一個相當古老的問題,但接受的答案已過時,所以我想我應該發佈這樣做的新方法。

FactoryGirl.define do 
    sequence :email do |n| 
    "email#{n}@factory.com" 
    end 

    factory :user do 
    email 
    password "foobar" 
    password_confirmation "foobar" 
    end 
end 

來源:Documentation

這是相當簡單一點,這是很好的。

7

除了上面的答案,您可以將gem 'faker'添加到您的Gemfile中,它將提供獨特的電子郵件。

FactoryGirl.define do 
    factory :admin do 
    association :band 
    email { Faker::Internet.email } 
    password "asdfasdf" 
    password_confirmation "asdfasdf" 
    end 
end 
+0

這裏的重要細節是將Faker生成器置於括號{}中,就像例子'email {Faker :: Internet.email}'中的那樣'',因爲沒有它們就無法運行,並且會引發相同的錯誤。 – juliangonzalez 2017-03-21 00:06:45

2

sequence給人非常獨特的電子郵件和Faker給隨機密碼。

FactoryGirl.define do 
    sequence :email do |n| 
    "user#{n}@test.com" 
    end 

    factory :user do 
    email 
    password { Faker::Internet.password(8, 20) } 
    password_confirmation { "#{password}" } 
    end 
end