Associazioni di Factory Girl (Bot)

In questo articolo vedremo come generare i dati per le associazioni has_one, has_many e polimorfiche usando FactoryGirl. Ogni associazione sarà descritta con un esempio, così potrete farvi un’idea di come creare fabbriche più complesse senza problemi.

Generare i dati per l’associazione has_one

Impostare l’associazione has_one è abbastanza facile, potete definirla all’interno della fabbrica. Se il nome della fabbrica è lo stesso dell’associazione, il nome della fabbrica può essere omesso. Per esempio:

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

Inoltre, è possibile specificare un factory diverso e sovrascrivere gli attributi:

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

È possibile specificare diverse strategie per creare l’associazione:

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

Tenete presente che questo non salverà un oggetto associato nel database.

Generare i dati per l’associazione has_many

Generare i dati per un’associazione has_many è un po’ più complicato. Si può definire un nuovo factory e usare la callback after(:create) per creare una lista di associazioni. Vediamo come fare in questo esempio:

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

L’attributo stories_count è un transitorio e disponibile negli attributi della factory e nella callback tramite il valutatore. Ora, è possibile creare un utente con storie con l’opzione di specificare quante storie vogliamo:

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

Si noti che ogni storia avrà un id unico, ma per avere altri attributi unici, è necessario generare valori diversi per ogni storia.

Lo si può ottenere usando la sequenza come esempio:

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

C’è anche una gemma interessante che può aiutare a generare valori unici chiamata faker.

Generare i dati per associazioni polimorfe

Un’associazione polimorfa può essere un po’ confusa. Speriamo che questo esempio vi aiuti a capirla meglio. Diciamo che avete le prossime classi con associazioni polimorfiche:

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

Quando create i factory per i modelli che hanno il modello polimorfico, create semplicemente il modello polimorfico in un blocco after(:create) e specificate che il polimorfico è il modello per cui il factory è:

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… è tutto!

Grazie per aver letto questo articolo.

Se siete interessati a leggere altri articoli interessanti su Rails assicuratevi di iscrivervi alla nostra newsletter!

Interessati ad argomenti simili? Assicurati di controllare le nostre opinioni su Rspec let vs prima, Rspec Setup e FactoryGirl – create vs build vs buldstubbed.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.