Enquanto estamos fazendo nossos sistemas, é muito comum termos diversas customizações que se repetem nos testes com FactoryBot. Por exemplo:
Criar um User admin
;
Criar um objeto com amarração de has_many
;
Criar um objeto com características, como um valor de enum especifico;
etc.
Para esses diversos casos há muitas formas de modificar valores no FactoryBot, um deles é usando Trait.
Traits permitem agruparmos certos comportamentos das factories
para facilitar a criação. Vamos ver um exemplo?
Temos um sistema com
User
eAppointment
ondeUser
has_many :appointments
, com as seguintesfactories
:
factory :user do
name { "Henrique Morato" }
admin { false }
end
factory :appointment do
name { 'Consulta' }
user
end
Podemos gerar Traits para facilitar a criação de Users admin
e também users
com Appointments
factory :user do
name { "Henrique Morato" }
admin { false }
trait :admin do
admin { true }
end
trait :with_appointments do
after(:create) { |user| create_list(:appointment, 2, user: user) }
end
end
No exemplo acima temos duas Traits :admin
e :with_appointments
, nesta segunda usamos um callback do FactoryBot para, após a criação, já fazer a amarração com Appointment
.
Para usar esses Traits no User
podemos aplicar a Factory da seguinte forma:
# criando um user admin
create(:user, :admin)
# criando um user admin e com appointments
create(:user, :admin, :with_appointments)
Agora nossas factories
ficam bem mais versáteis :)