2010-04-23 17 views
25

J'essaie de simuler une session en utilisant FactoryGirl/shoulda (cela a fonctionné avec des appareils mais j'ai des problèmes avec l'utilisation d'usines). Je suit les usines (login utilisateur et email les deux ont unique validations):quand est-ce que l'usine crée des objets en 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 

et voici le test

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 

mais quand je lance rake test:functionals, j'obtenir ce résultat de test

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! 

ce qui signifie que l'enregistrement existe déjà dans db lorsque je fais référence à celui-ci dans la configuration de test. Y a-t-il quelque chose que je ne comprends pas ici? est-ce que FactoryGirl crée toutes les usines en db au démarrage?

rails 2.3.5/Shoulda/factorygirl

Répondre

36

Factory(:user) est un raccourci pour Factory.create(:user) si la configuration de votre vous créez deux objets et de les enregistrer dans la base de données.

Factory.build(:user) crée un enregistrement user sans l'enregistrer dans la base de données.

EDIT

Au sein de votre usine session_user vous créez un utilisateur, puis créer un autre dans la configuration de votre test. FactoryGirl va créer un nouvel enregistrement user parce que vous avez l'association dans l'usine session_user.

Vous pouvez obtenir votre user exemple de l'objet session_user comme suit: -

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 

ou vous pouvez ajouter quelques détails à l'usine user pour assurer les adresses nom et e-mail uniques comme suit: -

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

mais je n'ai qu'une seule mention Factory (: user) dans mon code. pourquoi ça marche deux fois? (en second lieu est Factory (: session_user), qui est une instance de Session) –

+0

Vous devez vous connecter pour pouvoir lire la question –