2010-04-23 1043 views
25

Estoy tratando de simular una sesión usando FactoryGirl/shoulda (funcionó con accesorios pero estoy teniendo problemas con el uso de fábricas). He siguientes fábricas (de inicio de sesión de usuario y correo electrónico y los otros tenemos unique validaciones):cuando la chica de fábrica crea objetos 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 

y aquí está la prueba

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 

pero cuando corro rake test:functionals, yo conseguir este resultado de la prueba

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! 

lo que significa que el registro ya existe en db cuando me refiero a él en la configuración de prueba. ¿Hay algo que no entiendo aquí? ¿FactoryGirl crea todas las fábricas en db en el inicio?

rieles 2.3.5/Shoulda/factorygirl

Respuesta

36

Factory(:user) es un atajo para Factory.create(:user) así dentro de la configuración que va a crear dos objetos y guardarlos en la base de datos.

Factory.build(:user) creará un registro user sin guardarlo en la base de datos.

EDITAR

Dentro de su fábrica de session_user va a crear un usuario y luego la creación de otro dentro de la configuración de prueba. FactoryGirl creará un nuevo registro user porque tiene la asociación en la fábrica session_user.

Usted puede obtener su ejemplo user del objeto session_user de la siguiente manera: -

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 

o puede agregar algunos detalles a la fábrica user para asegurar nombre y correo electrónico direcciones únicas de la siguiente manera: -

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

pero solo tengo una mención de Fábrica (: usuario) en mi código. ¿Por qué funciona dos veces? (segundo es Factory (: session_user), que es una instancia de sesión) –

+0

Lo siento, debe leer la pregunta –

Cuestiones relacionadas