In dit artikel zullen we doornemen hoe we de gegevens voor has_one, has_many en polymorphic associaties kunnen genereren met FactoryGirl. Elke associatie zal worden beschreven met een voorbeeld, zodat u het idee kunt krijgen hoe u meer complexe fabrieken kunt maken zonder pijn.
Genereren van de gegevens voor has_one associatie
Het instellen van has_one associatie is vrij eenvoudig, u kunt het definiëren binnen de fabriek. Als de naam van de fabriek hetzelfde is als de naam van de associatie, kan de naam van de fabriek worden weggelaten. Bijvoorbeeld:
FactoryBot.define do factory :story do # story attributes author endend
Ook kun je een andere fabriek specificeren en attributen overschrijven:
FactoryBot.define do factory :story do # story attributes association :author, factory: :user, first_name: "Jon" endend
Het is mogelijk om verschillende strategieën te specificeren voor het maken van de associatie:
association :author, factory: :user, strategy: :build
Bedenk wel dat dit geen geassocieerd object in de database opslaat.
Genereren van de gegevens voor has_many associatie
Genereren van de gegevens voor een has_many associatie is een beetje ingewikkelder. Je kunt een nieuwe fabriek definiëren en after(:create) callback gebruiken om een lijst van associaties te maken. Laten we eens kijken hoe dat moet in dit voorbeeld:
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
Attribuut stories_count is een transient en beschikbaar in attributen van de factory en in de callback via de evaluator. Nu, kunt u een gebruiker met verhalen met de optie om aan te geven hoeveel verhalen we willen:
create(:user_with_stories).stories.length # 10create(:user_with_stories, stories_count: 15).stories.length # 15
Merk op dat elk verhaal zal een unieke id hebben, maar om andere attributen uniek te hebben, moet je verschillende waarden voor elk verhaal te genereren.
U kunt dat bereiken door de reeks als voorbeeld te gebruiken:
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
Er is ook een interessant juweeltje dat u kan helpen unieke waarden te genereren, genaamd faker.
Genereren van de gegevens voor polymorfe associaties
Een polymorfe associatie kan een beetje verwarrend zijn. Hopelijk zal dit voorbeeld je helpen het beter te begrijpen. Laten we zeggen dat u de volgende klassen met polymorfe associaties hebt:
class Profile belongs_to :profileable, polymorphic: trueendclass Account belongs_to :accountable, polymorphic: trueendclass User has_one :profile, as: :profileable has_one :account, as: :accountableend
Bij het maken van de fabrieken voor de modellen die het polymorfe model hebben, maakt u eenvoudig het polymorfe model in een after(:create) blok en specificeert u de polymorfe als het model waarvoor de fabriek is:
FactoryBot.define do factory :user, class: User do # user attributes after(:create) do |user| create(:account, accountable: user) create(:profile, profileable: user) end endend
En…. dat is het!
Bedankt voor het lezen van dit artikel.
Als je geïnteresseerd bent in het lezen van meer interessante artikelen over Rails, schrijf je dan in voor onze nieuwsbrief!
Interesseerd in soortgelijke onderwerpen? Zorg ervoor dat u onze kijk op Rspec laat vs voor, Rspec Setup en FactoryGirl – te creëren vs bouwen vs buldstubbed.