Factory Girl (Bot) Asocjacje

W tym artykule przejdziemy przez to jak wygenerować dane dla asocjacji has_one, has_many oraz polimorficznych przy użyciu FactoryGirl. Każda asocjacja zostanie opisana na przykładzie, dzięki czemu będziesz mógł bezboleśnie przekonać się, jak tworzyć bardziej złożone fabryki.

Generowanie danych dla asocjacji has_one

Ustawienie asocjacji has_one jest dość proste, możesz ją zdefiniować wewnątrz fabryki. Jeśli nazwa fabryki jest taka sama jak nazwa asocjacji, nazwę fabryki można pominąć. Na przykład:

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

Można również określić inną fabrykę i nadpisać atrybuty:

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

Można również określić różne strategie tworzenia asocjacji:

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

Pamiętajmy, że nie spowoduje to zapisania skojarzonego obiektu w bazie danych.

Generowanie danych dla asocjacji has_many

Generowanie danych dla asocjacji has_many jest nieco bardziej skomplikowane. Możesz zdefiniować nową fabrykę i użyć wywołania zwrotnego after(:create) do utworzenia listy asocjacji. Zobaczmy, jak to zrobić w tym przykładzie:

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

Atrybut stories_count jest przejściowy i dostępny w atrybutach fabryki oraz w wywołaniu zwrotnym poprzez ewaluator. Teraz można utworzyć użytkownika z historiami z możliwością określenia ile historii chcemy:

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

Proszę zauważyć, że każda historia będzie miała unikalne id, ale aby inne atrybuty były unikalne, należy wygenerować różne wartości dla każdej historii.

Możesz to osiągnąć, używając sekwencji jako przykładu:

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

Istnieje również interesujący klejnot, który może pomóc w generowaniu unikalnych wartości o nazwie faker.

Generowanie danych dla asocjacji polimorficznych

Asocjacja polimorficzna może być nieco myląca. Mam nadzieję, że ten przykład pomoże ci to lepiej zrozumieć. Powiedzmy, że masz następne klasy z asocjacjami polimorficznymi:

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

Podczas tworzenia fabryk dla modeli, które mają model polimorficzny, po prostu tworzysz model polimorficzny w bloku after(:create) i określasz polimorficzny, aby był modelem, dla którego jest fabryka:

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….. to wszystko!

Dziękuję za przeczytanie tego artykułu.

Jeśli jesteś zainteresowany czytaniem kolejnych ciekawych artykułów o Railsach koniecznie zapisz się do naszego newslettera!

Interesują Cię podobne tematy? Koniecznie sprawdź nasze podejście do Rspec let vs before, Rspec Setup oraz FactoryGirl – create vs build vs buldstubbed.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.