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.