tutorial sheet rails factorybot example cheat bot association ruby-on-rails shoulda factory-bot

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