ruby on rails - sheet - ¿Cuándo crea Factory los objetos en db?
factorybot association (1)
Estoy tratando de simular una sesión usando FactoryGirl
/ shoulda
(funcionó con accesorios pero estoy teniendo problemas con el uso de fábricas). Tengo las siguientes fábricas (el usuario y el correo electrónico tienen validaciones unique
):
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 ejecuto la rake test:functionals
, obtengo este resultado de 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
Factory(:user)
es un acceso directo para Factory.create(:user)
por lo que dentro de su configuración está creando dos objetos y los está guardando en la base de datos.
Factory.build(:user)
le creará un registro de user
sin guardarlo en la base de datos.
EDITAR
Dentro de su session_user
factory, está creando un usuario y luego creando otro dentro de su configuración de prueba. FactoryGirl
creará un nuevo registro de user
porque tiene la asociación en la fábrica de session_user
.
Puede obtener su instancia de user
del objeto session_user
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 de user
para asegurar un nombre único y direcciones de correo electrónico de la siguiente manera: -
Factory.define :user do |u|
u.sequence(:login) {|n| "quentin#{n}" }
u.sequence(:email) {|n| "quentin#{n}@example.com"}
end