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.