Această mini-serie din două părți a fost scrisă pentru persoanele care doresc să se ocupe de lucrul cu Factory Girl și să-și taie hainele fără să se sapă prea mult prin documentație. Pentru cei care au început să se joace cu teste mai degrabă recent, am făcut tot posibilul să-i păstrez prietenia cu noii prieteni.
Evident, dacă am fost în aceleași pantofi într-un anumit moment, m-au făcut să cred că nu ia prea mult pentru a face oamenii noi să se simtă mai confortabil cu testarea. A lua un pic mai mult timp pentru a explica contextul și demystifying lingo merge un drum lung în reducerea ratelor de frustrare pentru incepatori.
Să începem cu un pic de istorie și să vorbim despre oamenii buni de la ghinionul care sunt responsabili pentru acest popular bijuterie Ruby. Înapoi în 2007/2008, Joe Ferris, CTO la thinkbot, a avut-o cu program și a început să-și gătească propria soluție. Trecerea prin diferite fișiere pentru a testa o singură metodă a fost un punct comun de durere în timp ce se ocupă cu fixtures. Puneți în mod diferit și ignorând tot felul de inflexibilități, această practică conduce, de asemenea, la scrierea de teste care nu vă spun multe despre contextul lor fiind testat imediat.
Nefiind vândute pe baza acestei practici, el a făcut-o să vadă diferite soluții pentru fabrici, dar nici unul nu a sprijinit tot ce dorea. Deci, el a venit cu Factory Girl, care a făcut testarea cu date de testare mai ușor de citit, uscat și, de asemenea, mai explicit, oferindu-vă contextul pentru fiecare test. Câțiva ani mai târziu, Josh Clayton, director de dezvoltare la thinkbot din Boston, a preluat funcția de întreținător al proiectului. De-a lungul timpului, această bijuterie a crescut constant și a devenit un "element" în comunitatea Ruby.
Să vorbim mai mult despre principalele puncte de durere pe care Factory Girl le rezolvă. Când construiți suita de testare, aveți de-a face cu multe înregistrări asociate și cu informații care se schimbă frecvent. Doriți să vă puteți construi seturi de date pentru testele de integrare care nu sunt fragile, ușor de gestionat și explicite. Fabricile dvs. de date ar trebui să fie dinamice și capabile să se refere la alte fabrici - ceva care este în parte dincolo de dispozitivele YAML din zilele vechi.
O altă comoditate pe care doriți să o aveți este abilitatea de a suprascrie atributele obiectelor în zbor. Factory Factory vă permite să faceți totul fără efort - având în vedere faptul că este scris în Ruby și multe vrăjitorii de metaprogramare se întâmplă în spatele scenei - și vă sunt oferite un limbaj special pentru domeniu, care este ușor pe ochi de asemenea.
Construirea datelor dvs. de fixare cu această bijuterie poate fi descrisă ca fiind ușoară, eficientă și în general mai convenabilă decât a fișierelor cu corpuri de iluminat. În acest fel, puteți trata mai mult conceptele decât cu coloanele reale din baza de date. Dar destul de vorbit despre vorbe, să ne punem mâinile puțin murdare.
Oamenii care au experiență în aplicarea aplicațiilor de testare și care nu au nevoie să învețe despre conceptul de fixtures, vă rugăm să nu ezitați să mergeți direct la secțiunea următoare. Aceasta este pentru începători care au nevoie doar de o actualizare despre testarea datelor.
Programele sunt date de probă - asta este cu adevărat! Pentru o bună parte din suita de testare, doriți să puteți popula baza de date de testare cu date care sunt adaptate la cazurile de testare specifice. De-a lungul timpului, mulți utilizatori au folosit YAML pentru aceste date - ceea ce a făcut ca baza de date să fie independentă. În retrospectivă, independența în acest mod ar fi putut fi cel mai bun lucru în această privință. Era mai mult sau mai puțin un fișier pe model. Numai asta ți-ar putea da o idee despre toate tipurile de dureri de cap pe care oamenii le-au plâns. Complexitatea este un dușman în creștere rapidă, pe care YAML nu-l poate pregăti în mod eficient. Mai jos veți vedea ce astfel .YML
fișierul cu date de testare arata ca.
Fișier YAML: secret_service.yml
"necompletat: nume: Q favorite_gadget: Abilități radio pentru miez: inventarea gizmosului și hacking-ului
00 Agent: nume: James Bond favorite_gadget: Abilitățile submarine Lotus Esprit: Obținerea Bond Girls ucis și infiltrarea ascunsă "
Arată ca un hash, nu-i așa? Este o listă separată de perechi de chei / valoare care sunt separate de un spațiu gol. Puteți să faceți referire la alte noduri unul în celălalt, dacă doriți să simulați asociații din modelele dvs. Dar cred că este corect să spun că acolo se oprește muzica și mulți spun că durerea lor începe. Pentru seturile de date care sunt puțin mai implicate, dispozitivele YAML sunt greu de întreținut și greu de schimbat fără a afecta alte teste. Le puteți face să funcționeze, bineînțeles - în cele din urmă, dezvoltatorii le-au folosit mult în trecut - dar mulți oameni au fost de acord că prețul care trebuie plătit pentru gestionarea programelor a fost doar puțin prea mare.
Pentru a evita ruperea datelor de testare atunci când apar modificările inevitabile, dezvoltatorii au fost bucuroși să adopte strategii mai noi care să ofere o mai mare flexibilitate și comportament dinamic. Aici a venit Factory Girl și a părăsit zilele YAML în urmă. O altă problemă este dependența puternică dintre test și .YML
fișierul fișierului. Vizitatorii misterios sunt, de asemenea, o mare durere cu aceste tipuri de corpuri de iluminat. Factory Factory vă permite să evitați acest lucru prin crearea obiectelor relevante pentru testele inline.
Sigur, butoanele YAML sunt rapide și am auzit că oamenii susțin că un suită de testare lentă, cu date de la Factory Girl, le-a făcut să se întoarcă în țara YAML. În mintea mea, dacă folosești Factory Girl atât de mult încât încetinește cu adevărat testele tale, este posibil să exagerezi inutil fabrici și ai putea să ignori strategii care nu lovesc baza de date. Veți vedea ce vreau să spun când ajungem la secțiunea / secțiunile relevante. Desigur, folosiți tot ce aveți nevoie, însă considerați-vă avertizat dacă sunteți ars de YAML.
Cred că ar fi corect să adăugăm că în primele zile de la Rails și Ruby TDD, setările YAML erau standardul de facto pentru stabilirea datelor de testare în aplicația dvs. Aceștia au jucat un rol important și au contribuit la avansarea industriei. În zilele noastre au un rău în mod rezonabil rău. Timpul se schimba, deci trecem la fabrici, care sunt menite sa inlocuiasca corpurile de iluminat.
Presupun că ai deja Ruby și RSpec pentru testarea instalată pe sistemul tău. Dacă nu, reveniți după consultarea Google și ar trebui să fiți bine să mergeți. E destul de simplă, aș spune. Puteți instala bijuteria manual în terminal prin intermediul Coajă:
bash gem instala factory_girl
sau adăugați-o la dvs. Gemfile:
rubin bijuterie "factory_girl", "~> 4.0"
și fugi instalare pachet
.
Acum trebuie doar să necesita
Factory Factory pentru a finaliza configurarea. Aici folosesc RSpec, deci adăugați următoarele în partea de sus în /spec/spec_helper.rb
:
ruby necesita 'factory_girl'
Sunteți acoperit, desigur, dacă doriți să utilizați Factory Girl with Rails. factory_girl_rails
bijuterie oferă o integrare la îndemână Rails pentru fata de la fabrica
.
Coajă:
bash gem instala factory_girl_rails
Gemfile:
rubin bijuterie "factory_girl_rails", "~> 4.0"
și necesita
desigur, în spec / spec_helper.rb
:
ruby necesită "factory_girl_rails"
Dacă preferați să scrieți ceva asemănător (bineînțeles că faceți)
Rubin:
ruby create (: utilizator)
in loc de
ruby FactoryGirl.create (: utilizator)
de fiecare dată când utilizați una dintre fabricile dvs. trebuie doar să includeți FactoryGirl :: Sintaxa :: Metode
modul în fișierul de configurare a testului. Dacă uitați acest pas, trebuie să prefaceți toate metodele Factory Girl cu aceeași prefață verbală. Acest lucru funcționează cu orice aplicație Ruby, nu doar cu Rails, desigur.
Pentru RSpec găsiți spec / spec_helper.rb
fișier și adăugați:
"ruby necesită" factory_girl_rails "
RSpec.configure do | config | config.include FactoryGirl :: Sintaxă :: Metode termină "
Pentru începătorii dintre dvs., aveți grijă ca RSpec.configure
bloc va fi deja acolo - îngropat sub un anumit număr de comentarii. Puteți efectua, de asemenea, aceeași configurare într-un fișier separat al propriului dumneavoastră spec / suport / factory_girl.rb
. În acest caz va trebui să adăugați, bineînțeles, întregul bloc config.
Aceeași configurație funcționează dacă utilizați alte biblioteci pentru testare:
Puteți merge mai mult la configurația dvs. prin aruncarea înăuntru DatabaseCleaner
, de exemplu, dar documentația implică faptul că această configurare este suficientă pentru a merge, așa că voi trece de aici.
Puteți defini fabricile dvs. oriunde, dar acestea vor fi încărcate automat dacă sunt plasate în următoarele locații:
RSpec:
bash spec / factories.rb spec / fabrici / * rb
Testul :: Unitate:
testul bash / fabrici.rb test / fabrici / * rb
După cum puteți vedea, aveți opțiunea de a le împărți în fișiere separate care să adere la orice logică, sau să vă îmbinați fabricile împreună într-o singură mare factories.rb
fişier. Complexitatea proiectului dvs. va fi cea mai bună îndrumare pentru momentul în care se vor separa în mod logic fabricile în propriile fișiere separate.
Factory Factory oferă o sintaxă rubinică DSL bine dezvoltată pentru definirea unor fabrici utilizator, post sau orice alt obiect - nu numai Înregistrare activă obiecte. Cursurile clare despre Ruby sunt perfect fine. Începeți prin a configura un bloc de definire în factories.rb
fişier.
Rubin:
"rubin FactoryGirl.definiti face
Sfârșit"
Toate fabricile sunt definite în interiorul acestui bloc. Unitățile de producție au nevoie doar de :simbol
numele și un set de atribute pentru a începe. Acest nume trebuie să fie snake_cased versiune a modelului pe care doriți să-l simulați ca SecretServiceAgent în exemplul următor. Fabrica de mai jos este numită secret_service_agent
și are atribute numite Nume
, favorite_gadget
și aptitudini
.
Rubin:
"rubin FactoryGirl.definiti face
fabrică: secret_service_agent face numele "Q" favorite_gadget "Abilitățile submarine Lotus Esprit" "Inventarea gizmosului și hacking-ului" sfârșit
Sfârșit"
Dacă luați un singur lucru în afara acestui articol, ar trebui să fie următoarele: Definiți numai o fabrica cea mai goală pentru a fi valabilă în mod valabil implicit în sensul valabilităților Active Record, de exemplu.
Atunci când face call Factory Girl Salvați!
în cazuri, validările dvs. vor fi exercitate. Dacă oricare dintre ele nu reușește, ActiveRecord :: RecordInvalid
se ridică. Definirea numai a minimului gol vă oferă mai multă flexibilitate în cazul în care datele dvs. se schimbă și veți reduce șansele de rupere a testelor și duplicării - deoarece cuplarea este redusă la miez. Nu fi leneș atunci când vă compuneți fabricile - va plăti mult timp!
Dacă credeți că acest lucru este greu de gestionat, probabil că veți fi bucuroși să auzim că există soluții la îndemână pentru a segrega obiectele și atributele acestora. Moştenire și trasaturi vor deveni aliați excelenți, deoarece sunt strategii utile pentru a completa fabricile de oase goale și a le păstra DRY în același timp. Aflați mai multe despre Moștenirea de mai jos, iar cel de-al doilea articol se va concentra destul de puțin pe Trăsături.
Dacă ați inclus FactoryGirl :: Sintaxa :: Metode
în etapa de configurare, puteți utiliza sintaxa stenografică pentru a crea fabrici în testele dvs. Aveți patru opțiuni pe care oamenii le apelează construi strategii:
ruby create (: some_object) #FactoryGirl.create (: some_object)
Aceasta returnează o instanță a clasei pe care fabrica o simulează. Se recomandă utilizarea crea
numai când trebuie să atingi baza de date. Această strategie încetinește suita de testare dacă este utilizată în mod inutil. Utilizați-l dacă doriți să executați validările, deoarece acestea se vor executa Salvați!
in fundal. Cred că această opțiune este cea mai potrivită atunci când faci teste de integrare în care vrei să implici o bază de date pentru scenariile tale de testare.
rubin construiți (: some_object) # FactoryGirl.build (: some_object)
El instantează și atribuie atribute, dar veți primi o instanță returnată care nu este salvată în baza de date-construi
păstrează obiectul numai în memorie. Dacă doriți să verificați dacă un obiect are anumite atribute, acest lucru va face treaba, deoarece nu aveți nevoie de acces la baze de date pentru astfel de lucruri. În spatele scenelor pe care nu le folosește Salvați!
, ceea ce înseamnă că validările nu sunt executate.
Când utilizați asocierea cu aceasta, s-ar putea să fugi într-o mână mică. Există o mică excepție în ceea ce privește salvarea obiectului prin construi
-aceasta construiește dar obiectul creează asociațiile - pe care le voi acoperi în secțiunea despre asociațiile de fabrici de fată. Există o soluție pentru asta, în cazul în care nu este ceea ce ați fost pentru cumpărături.
ruby build_stubbed (: some_object) # FactoryGirl.build_stubbed (: some_object)
Această opțiune a fost creată pentru accelerarea testelor dvs. și pentru cazuri de testare în care niciunul dintre coduri nu trebuie să atingă baza de date. De asemenea, instanțiază și atribuie atribute ca fiind construi
, dar face doar ca obiectele să pară ca și cum ar fi fost persistente. Obiectul returnat are toate atributele definite de la fabrica dvs. stubate afară - plus un fals id
și zero
marcajele de timp. Asociațiile lor sunt de asemenea stângate, spre deosebire de acestea construi
asociațiilor care le utilizează crea
pe obiecte asociate. Deoarece această strategie se ocupă de stubs și nu are nici o dependență de baza de date, aceste teste vor fi la fel de repede ca și ei.
Această metodă va returna un hash cu numai atributele definite în fabrica relevantă - fără asociații, timbre și ID-ul, desigur. Este convenabil dacă doriți să construiți o instanță a unui obiect fără a vă lăsa să faceți clic manual cu atributele hashes. Am văzut-o cea mai mare parte folosită în specificațiile controlerului similare cu aceasta:
Rubin:
"ruby" redirecționează către o anumită locație "nu postați: crea, spion: attributes_for (: spy)
așteptați (răspuns) .to redirect_to (some_location) final "
Pentru a închide această secțiune, permiteți-mi să vă dau un exemplu simplu pentru a vedea diferitele obiecte returnate din aceste patru strategii de construire. Mai jos puteți compara cele patru obiecte diferite de la care veți obține attributes_for
, crea
, construi
și build_stubbed
:
"rubin FactoryGirl.definiti face
fabrică: spion face numele "Marty McSpy" favorite_gadget "Hoverboard" abilități "Infiltrație și spionaj" sfârșit
Sfârșit"
"ruby attributes_for (: spion)
"
"ruby create (: spion)
"ruby construi (: spion)
"ruby build_stubbed (: spion)
Sper că acest lucru a fost util dacă ați mai rămas o confuzie despre cum funcționează și când să utilizați ce opțiune.
O să-ți placă asta! Cu moștenire poți defini fabrici numai cu atributele necesare pe care fiecare clasă are nevoie pentru creație. Această fabrică-mamă poate genera cât mai multe fabrici "copil", după cum considerați adecvate, pentru a acoperi toate tipurile de scenarii de testare cu seturi diferite de date. Păstrarea datelor de test DRY este foarte importantă, iar moștenirea face acest lucru mult mai ușor pentru dvs..
Spuneți că doriți să definiți câteva atribute de bază ale unei fabrici și în cadrul aceleiași fabrici să aveți fabrici diferite pentru aceeași fabrică Clasă cu atribute diferite. În exemplul de mai jos, puteți vedea cum puteți evita repetarea atributelor doar prin crăparea fabricilor. Să emulăm a Spion care trebuie să se adapteze la trei scenarii diferite de testare.
factories.rb
"rubin FactoryGirl.definiti face
fabrică: spion face numele "Marty McSpy" license_to_kill abilități false "Spionaj și inteligență"
fabrică: managerul de carieră face calificările "Q" "Inventarea gizmosului și a hacking-ului" sfârșitul fabricii: obligațiuni face numele "James Bond" license_to_kill sfârșitul sfârșitul adevărat
Sfârșit"
some_spec.rb
"ruby bond = crea (: obligațiune) quartermaster = create (: quartermaster)
quartermaster.name # => 'Q' quartermaster.skills # => 'Inventarea gizmosului și hacking-ului' quartermaster.licence_to_kill # => false
bond.name # => 'James Bond' bond.skills # => 'Spionaj și inteligență' bond.licence_to_kill # => true "
După cum puteți observa, :legătură
și :intendent
fabricile moștenesc atribute ale părintelui lor :spion
. În același timp, puteți suprascrie cu ușurință atributele după cum este necesar și puteți fi foarte expresiv în acest sens prin numele fabricilor. Imaginați-vă toate liniile de cod salvate pentru că nu trebuie să repetați aceeași setare de bază dacă doriți să testați diferite stări sau obiecte asemănătoare. Această caracteristică singură merită folosită Factory Girl și face dificilă revenirea la dispozitivele YAML.
Dacă doriți să evitați definițiile din fabrică, puteți, de asemenea, să legeți în mod explicit fabricile cu părintele lor prin furnizarea unei mamă
hash:
factories.rb
"fabrica de rubin: spion face numele" Marty McSpy "license_to_kill abilități false" Spionaj și inteligență "sfârșit
fabrică: obligațiuni, părinte:: spion face numele "James Bond" license_to_kill adevărat sfârșit "
Este aceeași funcționalitate și aproape ca DRY.
Aici este un mic, dar cu toate acestea binevenit plus față de Factory Girl, care face tratarea cu liste ușor ca placinta:
Din când în când, în situațiile în care doriți să aveți mai multe instanțe ale unei fabrici fără prea multă fuzz, acestea vor fi la îndemână. Ambele metode vor returna un tablou cu cantitatea de elemente fabricate specificate. Destul de curat dreapta?
Rubin:
rubin spy_clones = create_list (: spion, 3)
fake_spies = build_list (: spion, 3)
spy_clones # => [# #
fake_spies # => [#
Există diferențe subtile între cele două opțiuni, dar sunt sigur că le înțelegeți până acum. De asemenea, ar trebui să menționez că puteți oferi ambele metode cu un hash de atribute dacă doriți să înlocuiți atributele fabricii în zbor din anumite motive. Suprascrierile vor mânca un pic din viteza dvs. de testare dacă creați o mulțime de date de testare cu suprascrieți. Probabil ca o fabrica separata cu aceste atribute schimbate va fi o optiune mai buna pentru crearea de liste.
"ruby smug_spies = create_list (: spion, 3, abilități:" glumesc prost ")
double_agents = build_list (: spion, 3, nume: "Vesper Lynd", abilități: "Seducție și contabilitate")
smug_spies # => [# #
double_agents # => [#
Veți avea nevoie frecvent de o pereche de obiecte, astfel încât Factory Girl vă oferă alte două opțiuni:
Este aceeași idee ca mai sus, dar matricea returnată deține doar două înregistrări la un moment dat.
"ruby create_pair (: spion) # => [# #
build_pair (: spy) # => [#
Dacă credeți că spionii de numire ar putea fi mai puțin statici, aveți absolut dreptate. În această secțiune finală vom examina crearea unor valori secvențiale unice ca date de testare pentru atributele fabricii dvs..
Când ar putea fi util acest lucru? Dar, de exemplu, adresele de e-mail unice pentru testarea autentificării sau nume de utilizator unice? Acolo secvențele strălucesc. Să ne uităm la câteva moduri diferite în care vă puteți folosi secvenţă
:
"rubin FactoryGirl.definiti face
succesiune: spy_email nu | n | "00#[email protected]" se termină
fabrică: spion face numele "Marty McSpy" email "[email protected]" abilități "Spionaj și infiltrare" license_to_kill false
fabrică: elite_spy face numele "Edward Donne" license_to_kill sfârșitul sfârșitul adevărat
Sfârșit
top_spy = creați (: elite_spy) top_spy.email = generează (: spy_email)
top_spy.email # => "[email protected]" "
Deoarece această secvență este definită "global" pentru toate fabricile dvs. - nu aparține unei singure fabrici - puteți folosi acest generator de secvențe pentru toate fabricile dvs. oriunde aveți nevoie : spy_email
. Tot ce ai nevoie este Genera
și numele secvenței.
Ca o variantă mică care este super convenabilă, vă voi arăta cum să atribuiți direct secvențelor ca atribute fabricilor dvs. Utilizați aceeași condiție ca cea de mai sus, unde secvența dvs. este definită "la nivel global". În cazul unei definiții din fabrică, puteți renunța Genera
apelul de tip și Factory Girl vor atribui valoarea returnată din secvență direct la atributul cu același nume. ordinat!
"rubin FactoryGirl.definiti face
succesiune: e-mail nu | n | "00#[email protected]" se termină
fabrică: secret_service_agent face numele "Edwad Donne" abilități de e-mail "Spionaj și infiltrare" license_to_kill true end
Sfârșit"
De asemenea, puteți utiliza a secvenţă
pe lenești. Voi aborda acest subiect în cel de-al doilea articol, dar, din motive de exhaustivitate, am vrut să-l menționez și aici. În cazul în care aveți nevoie de o valoare unică atribuită momentului în care instanța este creată - aceasta se numește leneş deoarece acest atribut așteaptă cu atribuirea valorii până când secvențele de instanțiere a obiectului au nevoie doar de un bloc pentru a funcționa.
"rubin
FactoryGirl.define nu
secvență: "Misiunea # număr la # DateTime.now.to_formatted_s (: scurt)" sfârșit
fabrică: spion face numele "Marty McSpy" desfășurare generate (: mission_deployment) sfârșit
Sfârșit
some_spy = create (: spy) some_spy.deployment # => "Misiunea # 1 la 19 Oct 21:13" "
Blocul pentru atributul fabricii este evaluat atunci când obiectul devine instanțiat. În cazul nostru, veți obține un șir compus dintr-un număr de misiune unic și un nou DateTime
obiect ca valori pentru fiecare :spion
care se desfășoară.
Această opțiune este cea mai bună atunci când o secvență de valori unice este necesară numai pentru un atribut pentru o singură fabrică. Nu ar avea sens să o definiți în afara acestei fabrici și, eventual, să o căutați în altă parte, dacă aveți nevoie să o modificați. În exemplul de mai jos căutăm să generăm ID-uri unice pentru fiecare mașină spion.
"rubin FactoryGirl.definiti face
fabrica: aston_martin nu secvență (: vehicul_id_număr) | n | "A_M _ # n" se termină
Sfârșit
spycar_01 = creare (: aston_martin) spycar_01.vehicle_id_number # => "A_M_1"
spycar_02 = creare (: aston_martin) spycar_02.vehicle_id_number # => "A_M_2" "
Ei bine, poate ar trebui să oferim vehicle_id_number
atribui o altă valoare de pornire decât 1
? Să presupunem că dorim să oferim câteva prototipuri înainte ca mașina să fie pregătită pentru producție. Puteți oferi un al doilea argument ca valoare de pornire pentru secvența dvs. Hai să mergem 9
de data asta.
"rubin FactoryGirl.definiti face
fabrică: aston_martin do sequence (: vehicle_id_number, 9) | n | "A_M _ # n" se termină
Sfârșit
spycar_01 = creare (: aston_martin) spycar_01.vehicle_id_number # => "A_M_9"
spycar_02 = creare (: aston_martin) spycar_02.vehicle_id_number # => "A_M_10"
"
După cum ați văzut până acum, Factory Girl oferă un Ruby DSL bine echilibrat, care construiește obiecte în locul înregistrărilor bazei de date pentru datele dvs. de testare. Vă ajută să păstrați testele dvs. concentrate, uscate și ușor de citit atunci când vă ocupați de datele fictive. Aceasta este o realizare destul de solidă în cartea mea.
Amintiți-vă că definițiile din fabrică ale oaselor goale sunt cheia pentru sănătatea viitoare. Cele mai multe date din fabrică pe care le puneți în spațiul dvs. global de testare, cu atât mai probabil veți avea un fel de durere de întreținere.
Pentru testele dvs. de unitate, Factory Girl va fi inutilă și doar încetinește suita de testare. Josh Clayton ar fi primul care va atesta acest lucru și va recomanda cea mai bună practică de a utiliza Factory Girl selectiv și cât mai puțin posibil.