rails has_many girl factorybot create bot association ruby factory-bot

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



factorybot association (3)

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 consuman 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() lo 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

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!


El uso de FactoryGirl.build (: factory_name) no persiste en el DB y no llama a save !, por lo que las validaciones de ActiveRecord 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 ActiveRecord. Esto es obviamente más lento, pero puede detectar errores de validación (si te importan en tus pruebas).


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. Las rellamadas posteriores (: compilación) y posteriores (: crear) se ejecutarán después de que se guarde la fábrica. También se llamará antes (: create) 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. Se llamará a la devolución de llamada después de (: compilación) después de que se construye la fábrica.

Tenga en cuenta que en la mayoría de los casos, cuando se prueban los modelos, es mejor usar build_stubbed para un mejor rendimiento. Lea más sobre esto here .