Pregunta ¿Cuál es la diferencia entre los métodos de compilación y creación en FactoryGirl?


La introducción de Factory Girl delinea la diferencia entre FactoryGirl.build() y FactoryGirl.create():

# Returns a User instance that's not saved
user = FactoryGirl.build(:user)

# Returns a saved User instance
user = FactoryGirl.create(:user)

Todavía no entiendo las diferencias prácticas entre los dos. ¿Alguien puede dar un ejemplo en el que le gustaría usar uno y no el otro? ¡Gracias!


76
2017-12-31 05:57


origen


Respuestas:


los create() método persiste la instancia del modelo mientras que el build() método lo mantiene solo en la memoria.

Personalmente, uso el create() método solo cuando la persistencia es realmente necesaria ya que escribir en DB hace que las pruebas consuman mucho tiempo.

p.ej.

Creo usuarios para autenticación con create() porque mi motor de autenticación consulta la base de datos.

Para verificar si un modelo tiene un atributo, build() método hará porque no se requiere acceso a DB.

it{Factory.build(:user).should respond_to(:name)}

Actualizar

"Hay una excepción que la compilación realmente 'crea' cuando construyes asociaciones, es decir, tu asociación ya no está en la memoria, sino que persiste. Ten esto en cuenta" - Shakes


95
2018-01-04 21:03



Utilizando FactoryGirl.build(:factory_name) no persiste en el DB y no llama save!, por lo que sus validaciones de Active Record no se ejecutarán. Esto es mucho más rápido, pero las validaciones pueden ser importantes.

Utilizando FactoryGirl.create(:factory_name) persistirá en el DB y llamará a las validaciones de Active Record. Esto es obviamente más lento, pero puede detectar errores de validación (si te importan en tus pruebas).


10
2017-08-01 19:51



FactoryGirl.create() creará nuevos objetos y asociaciones (si la fábrica tiene alguno) para ello. Todos serán persistentes en una base de datos. Además, activará las validaciones de modelos y bases de datos. Devolución de llamada after(:build) y after(:create) se llamará después de que se guarde la fábrica. también before(:create) se llamará antes de que se guarde la fábrica.

FactoryGirl.build() no guardará un objeto, pero seguirá haciendo solicitudes a una base de datos si la fábrica tiene asociaciones. Activará validaciones solo para objetos asociados. Llamar de vuelta after(:build) se llamará después de que se construya la fábrica.

Tenga en cuenta que en la mayoría de los casos cuando los modelos de prueba son los mejores para usar build_stubbed para un mejor rendimiento. Lea más sobre esto aquí.


0
2018-05-04 10:00