Factory Girl (Bot) Asociace

V tomto článku si ukážeme, jak generovat data pro has_one, has_many a polymorfní asociace pomocí FactoryGirl. Každá asociace bude popsána na příkladu, takže si můžete udělat představu, jak bezbolestně vytvářet složitější továrny.

Generování dat pro asociaci has_one

Nastavení asociace has_one je poměrně snadné, můžete ji definovat v rámci továrny. Pokud je název továrny stejný jako název asociace, lze název továrny vynechat. Například:

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

Také můžete zadat jinou továrnu a přepsat atributy:

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

Je možné zadat různé strategie pro vytvoření asociace:

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

Mějte na paměti, že se tím neuloží asociovaný objekt do databáze.

Vytvoření dat pro asociaci has_many

Vytvoření dat pro asociaci has_many je trochu složitější. Můžete definovat novou továrnu a pomocí zpětného volání after(:create) vytvořit seznam asociací. Podívejme se, jak to udělat v tomto příkladu:

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

Atribut stories_count je přechodný a je k dispozici v atributech továrny a ve zpětném volání prostřednictvím vyhodnocovacího modulu. Nyní můžete vytvořit uživatele s příběhy s možností zadat, kolik příběhů chceme:

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

Upozorňujeme, že každý příběh bude mít unikátní id, ale aby byly ostatní atributy unikátní, musíte pro každý příběh vygenerovat jiné hodnoty.

Toho můžete dosáhnout na příkladu sekvence:

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

Existuje také zajímavý klenot, který vám pomůže vygenerovat unikátní hodnoty a jmenuje se faker.

Generování dat pro polymorfní asociace

Polymorfní asociace může být trochu matoucí. Doufejme, že vám ji tento příklad pomůže lépe pochopit. Řekněme, že máte další třídy s polymorfními asociacemi:

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

Při vytváření továren pro modely, které mají polymorfní model, jednoduše vytvoříte polymorfní model v bloku after(:create) a zadáte, že polymorfní je model, pro který je továrna určena:

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

A…. to je vše!

Děkujeme, že jste si přečetli tento článek.

Pokud máte zájem číst další zajímavé články o Rails, určitě se přihlaste k odběru našeho newsletteru!

Zajímají vás podobná témata? Určitě se podívejte na náš pohled na témata Rspec let vs before, Rspec Setup a FactoryGirl – create vs build vs buldstubbed.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.