¿Cuál es la diferencia entre los métodos de comstackció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. ¿Puede alguien dar un ejemplo donde querría usar uno y no el otro? ¡Gracias!

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

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

p.ej

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

Para verificar si un modelo tiene un atributo, el método build() hará porque no se requiere acceso a la base de datos.

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

Actualizar

“Hay una excepción que la construcción en realidad ‘crea’ cuando estás creando asociaciones, es decir, tu asociación ya no está en la memoria, sino que persistió. Ten eso en cuenta” – Shakes

¡Usar FactoryGirl.build(:factory_name) no persiste en la base de datos y no llama a 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.

El uso de FactoryGirl.create(:factory_name) persistirá en la base de datos y llamará a las validaciones de registro activo. Esto es obviamente más lento, pero puede detectar errores de validación (si te preocupas por ellos en tus pruebas).

FactoryGirl.create() creará un nuevo objeto y asociaciones (si la fábrica tiene alguna) para ello. Todos serán persistidos en una base de datos. Además, activará tanto las validaciones del modelo como las de la base de datos. Las devoluciones de llamada after(:build) y after(:create) se llamarán después de que se guarde la fábrica. También before(:create) que se llame a before(:create) antes de guardar 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. La callback after(:build) se llamará después de que se haya construido la fábrica.

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