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.