Factory Girl (Bot) Asociații

În acest articol vom vedea cum să generăm date pentru asociațiile has_one, has_many și polimorfe folosind FactoryGirl. Fiecare asociație va fi descrisă cu un exemplu, astfel încât să vă puteți face o idee despre cum să creați fabrici mai complexe fără durere.

Generarea datelor pentru asociația has_one

Configurarea asociației has_one este destul de ușoară, o puteți defini în cadrul fabricii. În cazul în care numele fabricii este același cu numele asociației, numele fabricii poate fi omis. De exemplu:

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

De asemenea, puteți specifica o fabrică diferită și puteți suprascrie atributele:

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

Este posibil să specificați strategii diferite pentru crearea asociației:

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

Rețineți că acest lucru nu va salva un obiect asociat în baza de date.

Generarea datelor pentru asocierea has_many

Generarea datelor pentru o asociere has_many este un pic mai complicată. Puteți defini o nouă fabrică și folosi callback-ul after(:create) pentru a crea o listă de asociații. Să vedem cum să o facem în acest exemplu:

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

Atributul stories_count este un tranzitoriu și este disponibil în atributele fabricii și în callback prin intermediul evaluatorului. Acum, puteți crea un utilizator cu povești cu opțiunea de a specifica câte povești dorim:

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

Rețineți că fiecare poveste va avea un id unic, dar pentru ca alte atribute să fie unice, trebuie să generați valori diferite pentru fiecare poveste.

Puteți realiza acest lucru folosind secvența ca exemplu:

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

Există, de asemenea, o bijuterie interesantă care vă poate ajuta să generați valori unice, numită faker.

Generarea datelor pentru asociațiile polimorfe

O asociație polimorfă poate fi un pic confuză. Sperăm că acest exemplu vă va ajuta să o înțelegeți mai bine. Să presupunem că aveți următoarele clase cu asociații polimorfe:

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

Când creați fabricile pentru modelele care au modelul polimorfic, pur și simplu creați modelul polimorfic într-un bloc after(:create) și specificați că polimorfizabilul este modelul pentru care este fabricată fabrica:

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

și…. asta este!

Mulțumim că ați citit acest articol.

Dacă sunteți interesat să citiți mai multe articole interesante despre Rails asigurați-vă că vă abonați la newsletter-ul nostru!

Vă interesează subiecte similare? Nu uitați să verificați părerea noastră despre Rspec let vs before, Rspec Setup și FactoryGirl – create vs build vs buldstubbed.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.