A introdução da Factory Girl delineia a diferença entre FactoryGirl.build()
e FactoryGirl.create()
:
# Returns a User instance that's not saved
user = FactoryGirl.build(:user)
# Returns a saved User instance
user = FactoryGirl.create(:user)
Ainda não entendo as diferenças práticas entre os dois. Alguém pode dar um exemplo onde você gostaria de usar um e não o outro? Obrigado!
fonte
create
combuild
e desfazê-lo se o teste falhar?#create
ler e devolver o objeto persistente do disco, ou ele devolver o objeto que está na memória depois persistência-lo? Em outras palavras, fazer écreate(...)
equivalente acreate(...).reload
?O uso
FactoryGirl.build(:factory_name)
não persiste para o db e não chamasave!
, portanto, as validações do Active Record não serão executadas. Isso é muito mais rápido, mas as validações podem ser importantes.O uso
FactoryGirl.create(:factory_name)
persistirá no banco de dados e chamará as validações do Active Record. Obviamente, isso é mais lento, mas pode detectar erros de validação (se você se importar com eles em seus testes).fonte
FactoryGirl.create()
irá criar novos objetos e associações (se a fábrica tiver algum) para ele. Todos eles serão mantidos em um banco de dados. Além disso, ele acionará validações de modelo e banco de dados. Chamadas de retornoafter(:build)
eafter(:create)
serão chamadas depois que a fábrica for salva. Tambémbefore(:create)
será chamado antes que a fábrica seja salva.FactoryGirl.build()
não salvará um objeto, mas ainda fará solicitações a um banco de dados se a fábrica tiver associações. Ele irá disparar validações apenas para objetos associados. Ligue de voltaafter(:build)
será chamada depois que a fábrica for construída.Observe que, na maioria dos casos, ao testar os modelos, é melhor usar
build_stubbed
para melhor desempenho. Leia mais sobre isso aqui .fonte