In diesem Artikel werden wir durchgehen, wie man die Daten für has_one, has_many und polymorphe Assoziationen mit FactoryGirl generiert. Jede Assoziation wird anhand eines Beispiels beschrieben, so dass Sie eine Vorstellung davon bekommen, wie Sie mühelos komplexere Fabriken erstellen können.
Erzeugung der Daten für die has_one Assoziation
Das Einrichten der has_one Assoziation ist recht einfach, Sie können sie innerhalb der Fabrik definieren. Wenn der Fabrikname mit dem Namen der Assoziation übereinstimmt, kann der Fabrikname weggelassen werden. Zum Beispiel:
FactoryBot.define do factory :story do # story attributes author endend
Sie können auch eine andere Fabrik angeben und Attribute überschreiben:
FactoryBot.define do factory :story do # story attributes association :author, factory: :user, first_name: "Jon" endend
Es ist möglich, verschiedene Strategien für die Erstellung der Assoziation anzugeben:
association :author, factory: :user, strategy: :build
Denken Sie daran, dass dadurch kein assoziiertes Objekt in der Datenbank gespeichert wird.
Erzeugen der Daten für eine has_many-Assoziation
Das Erzeugen der Daten für eine has_many-Assoziation ist ein wenig komplizierter. Sie können eine neue Fabrik definieren und den after(:create) Callback verwenden, um eine Liste von Assoziationen zu erstellen. In diesem Beispiel sehen wir, wie das geht:
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
Das Attribut stories_count ist ein transientes Attribut und in den Attributen der Factory und im Callback über den Evaluator verfügbar. Jetzt können Sie einen Benutzer mit Geschichten erstellen, mit der Option, die Anzahl der gewünschten Geschichten anzugeben:
create(:user_with_stories).stories.length # 10create(:user_with_stories, stories_count: 15).stories.length # 15
Bitte beachten Sie, dass jede Geschichte eine eindeutige ID hat, aber um andere Attribute eindeutig zu haben, müssen Sie verschiedene Werte für jede Geschichte erzeugen.
Das können Sie am Beispiel der Sequenz erreichen:
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
Es gibt auch ein interessantes Juwel, das Ihnen helfen kann, eindeutige Werte zu generieren, es heißt faker.
Generierung der Daten für polymorphe Assoziationen
Eine polymorphe Assoziation kann ein wenig verwirrend sein. Hoffentlich hilft Ihnen dieses Beispiel, sie besser zu verstehen. Nehmen wir an, Sie haben die nächsten Klassen mit polymorphen Assoziationen:
class Profile belongs_to :profileable, polymorphic: trueendclass Account belongs_to :accountable, polymorphic: trueendclass User has_one :profile, as: :profileable has_one :account, as: :accountableend
Beim Erstellen der Fabriken für die Modelle, die das polymorphe Modell haben, erstellen Sie einfach das polymorphe Modell in einem after(:create) Block und geben das polymorphicable als das Modell an, für das die Fabrik gedacht ist:
FactoryBot.define do factory :user, class: User do # user attributes after(:create) do |user| create(:account, accountable: user) create(:profile, profileable: user) end endend
Und…. das war’s!
Danke, dass Sie diesen Artikel gelesen haben.
Wenn Sie an weiteren interessanten Artikeln über Rails interessiert sind, abonnieren Sie unseren Newsletter! Interessiert an ähnlichen Themen? Schauen Sie sich auch unsere Artikel über Rspec let vs before, Rspec Setup und FactoryGirl – create vs build vs buldstubbed an.