Factory Girl (Bot) Associations

Neste artigo vamos ver como gerar os dados para has_one, has_many e associações polimórficas usando a FactoryGirl. Cada associação será descrita com um exemplo, assim você pode ter a idéia de como criar fábricas mais complexas sem dor.

Gerar os dados para has_one associação

Configurar has_one associação é bastante fácil, você pode defini-la dentro da fábrica. Se o nome da fábrica for o mesmo que o nome da associação, o nome da fábrica pode ser deixado de fora. Por exemplo:

>

FactoryBot.define do factory :story do # story attributes author endend

Tambem, você pode especificar uma fábrica diferente e substituir atributos:

FactoryBot.define do factory :story do # story attributes association :author, factory: :user, first_name: "Jon" endend

É possível especificar diferentes estratégias para criar a associação:

association :author, factory: :user, strategy: :build

Cutem em mente que isto não salvará um objeto associado no banco de dados.

Gerar os dados para uma associação has_many

Gerar os dados para uma associação has_many é um pouco mais complicado. Você pode definir uma nova fábrica e usar after(:create) callback para criar uma lista de associações. Vamos ver como fazê-lo neste exemplo:

FactoryBot.define do # user factory without associated stories factory :user do # user attributes factory :user_with_stories do transient do stories_count 10 end after(:create) do |user, evaluator| create_list(:stories, evaluator.stories_count, user: user) end end endend

Attribute stories_count é uma contagem transiente e disponível em atributos da fábrica e na callback através do avaliador. Agora, você pode criar um usuário com histórias com a opção de especificar quantas histórias queremos:

create(:user_with_stories).stories.length # 10create(:user_with_stories, stories_count: 15).stories.length # 15

Por favor note que cada história terá um id único, mas para ter outros atributos únicos, você precisa gerar valores diferentes para cada história. Você pode conseguir isso usando a seqüência como exemplo:

FactoryBot.define do factory :story do # story attributes sequence(:title) { |n| "Title#{n}" } # Unique title for every story association :author, factory: :user, first_name: "Jon" endend

Há também uma jóia interessante que pode ajudá-lo a gerar valores únicos chamados faker.

Gerando os dados para associações polimórficas

Uma associação polimórfica pode ser um pouco confusa. Esperamos que este exemplo o ajude a compreendê-la melhor. Digamos que você tenha as próximas classes com associações polimórficas:

class Profile belongs_to :profileable, polymorphic: trueendclass Account belongs_to :accountable, polymorphic: trueendclass User has_one :profile, as: :profileable has_one :account, as: :accountableend

Ao criar as fábricas para os modelos que têm o modelo polimórfico, você simplesmente cria o modelo polimórfico em um bloco after(:create) e especifica o polimórfico a ser o modelo para o qual a fábrica está destinada:

FactoryBot.define do factory :user, class: User do # user attributes after(:create) do |user| create(:account, accountable: user) create(:profile, profileable: user) end endend

E…. é isso!

Obrigado por ler este artigo. Se você estiver interessado em ler mais artigos interessantes sobre Rails não deixe de assinar nossa newsletter! Interessado em tópicos similares? Não deixe de conferir nosso take on Rspec let vs antes, Rspec Setup e FactoryGirl – create vs build vs buldstubbed.

Deixe uma resposta

O seu endereço de email não será publicado.