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!
fuente
create
conbuild
y deshacerla si la prueba falla?#create
Lee y devuelve el objeto persistente del disco, o devuelve el objeto que está en la memoria después de persistirlo? En otras palabras, ¿es hacercreate(...)
equivalente acreate(...).reload
?El uso
FactoryGirl.build(:factory_name)
no persiste en la base de datos y no llamasave!
, por lo que las validaciones de Active Record no se ejecutarán. Esto es mucho más rápido, pero las validaciones pueden ser importantes.El uso
FactoryGirl.create(:factory_name)
persistirá en la base de datos y llamará a las validaciones de Active Record. Obviamente, esto es más lento, pero puede detectar errores de validación (si le importan en sus pruebas).fuente
FactoryGirl.create()
creará nuevos objetos y asociaciones (si la fábrica tiene alguna) para él. Todos se conservarán en una base de datos. Además, activará validaciones tanto del modelo como de la base de datos. Devuelve la llamadaafter(:build)
yafter(:create)
se llamará después de que se guarde la fábrica. Tambiénbefore(:create)
se llamará antes de que se guarde la fábrica.FactoryGirl.build()
no guardará un objeto, pero aún hará solicitudes a una base de datos si la fábrica tiene asociaciones. Activará validaciones solo para objetos asociados. La devolución deafter(:build)
llamada se llamará después de que se construya la fábrica.Tenga en cuenta que, en la mayoría de los casos, es mejor utilizar modelos de prueba
build_stubbed
para un mejor rendimiento. Lea más sobre esto aquí .fuente