Factory Girl(Bot) Asocijacije

Factory Girl(Bot) Asocijacije

U ovom članku ćemo proći kroz generisanje podataka za has_one, has_many i polimorfne asocijacije pomoću FactoriGirl. Svaka asocijacija će biti opisana na primeru, tako da možete dobiti ideju kako stvoriti složenije fabrike bez muke.

Generisanje podataka za udruživanje has_one

Postavljanje has_one asocijacije je prilično jednostavno, možete ga definisati u fabrici. Ako je ime fabrike isto kao i ime udruženja, ime fabrike može biti izostavljeno. Na primer:

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

Takođe, možete navesti različite atribute fabrike i poništiti:

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

Moguće je odrediti različite strategije za stvaranje asocijacije:

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

Imajte na umu da ovo neće sačuvati pridruženi objekat u bazi podataka.

Generisanje podataka za udruživanje has_many

Generisanje podataka za asocijaciju has_many je malo složenije. Možete definisati novu fabriku i koristiti after(:create) povratnog poziva za kreiranje liste asocijacija. Pogledajmo kako se to radi u ovom primeru:

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
  end
end

Atribut stories_count je privremen i dostupan je u atributima fabrike i u povratnom pozivu preko evaluatora. Sada možete stvoriti korisnika sa pričama sa opcijom da odredite koliko priča želimo:

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

Imajte na umu da će svaka priča imati jedinstveni ID, ali da bi ostali atributi bili jedinstveni, morate generisati različite vrednosti za svaku priču.

To možete postići koristeći sekvencu kao primer:

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"
  end
end

Tu je i zanimljiv gem koji vam može pomoći da generišete jedinstvene vrednosti zvane fejker .

Generiranje podataka za polimorfne asocijacije

Polimorfna asocijacija može biti pomalo zbunjujuća. Nadam se da će vam ovaj primer pomoći da ga bolje razumete. Recimo da imate sledeće klase sa polimorfnim asocijacijama:

class Profile
  belongs_to :profileable, polymorphic: true
end

class Account
  belongs_to :accountable, polymorphic: true
end

class User
  has_one :profile, as: :profileable
  has_one :account, as: :accountable
end

Kada kreirate fabrike za modele koji imaju polimorfni model, vi jednostavno kreirate polimorfni model u bloku after(: create) i odredite polimorfni model za koji je fabrika namenjena:

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

I to je to!

Hvala vam što ste pročitali ovaj članak.

Ako ste zainteresovani za čitanje još zanimljivih članaka o Rails-u, obavezno se pretplatite na naš bilten!

Zanimaju vas slične teme? Obavezno proverite naše mišljenje o Rspec let vs before , Rspec Setup i FactoryGirl - create vs build vs buldstubbed .