2010-04-23 25 views
25

我想模擬一個會話使用FactoryGirl/shoulda(它使用燈具,但我有使用工廠的問題)。我有以下的工廠(用戶登錄和電子郵件都有unique驗證):工廠女孩何時在db中創建對象?

Factory.define :user do |u| 
u.login 'quentin' 
u.email '[email protected]' 
end 

Factory.define :session_user, :class => Session do |ses| 
ses.association :user, :factory => :user 
ses.session_id 'session_user' 
end 

和這裏的測試

class MessagesControllerTest < ActionController::TestCase 

context "normal user" do 
    setup do 
    @request.session[:user_id]=Factory(:user).id 
    @request.session[:session_id]=Factory(:session_user).session_id 
    end 

    should "be able to access new message creation" do 
    get :new 
    assert_response :success 
    end 
end 
end 

但是當我運行rake test:functionals,我得到這個測試結果

1) Error: 
    test: normal user should be able to access new message creation. (MessagesControllerTest): 
    ActiveRecord::RecordInvalid: Validation failed: Account name already exists!, Email already exists! 

這意味着當我在測試設置中引用它時,記錄已經存在於db中。有什麼我不明白的嗎? FactoryGirl在啓動時在db中創建所有工廠?

軌2.3.5 /早該/ FactoryGirl

回答

36

Factory(:user)Factory.create(:user)所以你的設置中要創建兩個對象,並將它們保存到數據庫中的快捷方式。

Factory.build(:user)將創建一個user記錄而不保存到數據庫。

編輯

在您session_user工廠要創建一個用戶,然後創建另一個測試設置中。 FactoryGirl將創建一個新的user記錄,因爲您在session_user工廠中有關聯。

您可以從session_user對象讓你user爲例說明如下: -

context "normal user" do 
    setup do 
    session = Factory(:session_user) 
    @request.session[:session_id] = session.session_id 
    @request.session[:user_id] = session.user_id 
    end 

,或者你可以將某些細節添加到user工廠,以確保唯一的名稱和電子郵件地址如下: -

Factory.define :user do |u| 
u.sequence(:login) {|n| "quentin#{n}" } 
u.sequence(:email) {|n| "quentin#{n}@example.com"} 
end 
+1

但我只有一個工廠(:用戶)在我的代碼中提到。爲什麼它運行兩次? (第二個是Factory(:session_user),它是一個Session實例) – 2010-04-23 09:19:11

+0

抱歉,必須閱讀該問題 – 2010-04-23 09:23:57