Usando Traits com FactoryBot

Dicas - 30/Set/2019 - por Henrique Morato

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 e Appointment onde User has_many :appointments, com as seguintes factories:

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 :)

Documentação