I den här artikeln kommer vi att gå igenom hur man genererar data för has_one, has_many och polymorfa associationer med hjälp av FactoryGirl. Varje association kommer att beskrivas med ett exempel, så att du kan få en idé om hur du kan skapa mer komplexa fabriker utan smärta.
Generera data för has_one association
Inställandet av has_one association är ganska enkelt, du kan definiera den i fabriken. Om fabriksnamnet är detsamma som associationsnamnet kan fabriksnamnet utelämnas. Till exempel:
FactoryBot.define do factory :story do # story attributes author endend
Du kan också ange en annan fabrik och åsidosätta attribut:
FactoryBot.define do factory :story do # story attributes association :author, factory: :user, first_name: "Jon" endend
Det är möjligt att ange olika strategier för att skapa associationen:
association :author, factory: :user, strategy: :build
Tänk på att detta inte sparar ett associerat objekt i databasen.
Generera data för has_many association
Generera data för en has_many association är lite mer komplicerat. Du kan definiera en ny fabrik och använda after(:create) callback för att skapa en lista över associationer. Låt oss se hur du gör det i det här exemplet:
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
Attributet stories_count är en transient och tillgängligt i fabrikens attribut och i callback via utvärderaren. Nu kan du skapa en användare med berättelser med möjlighet att ange hur många berättelser vi vill ha:
create(:user_with_stories).stories.length # 10create(:user_with_stories, stories_count: 15).stories.length # 15
Observera att varje berättelse kommer att ha ett unikt id, men för att andra attribut ska vara unika måste du generera olika värden för varje berättelse.
Det kan du åstadkomma med sekvensen som exempel:
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
Det finns också en intressant pärla som kan hjälpa dig att generera unika värden och som heter faker.
Generera data för polymorfa associationer
En polymorf association kan vara lite förvirrande. Förhoppningsvis kan det här exemplet hjälpa dig att förstå det bättre. Låt oss säga att du har följande klasser med polymorfa associationer:
class Profile belongs_to :profileable, polymorphic: trueendclass Account belongs_to :accountable, polymorphic: trueendclass User has_one :profile, as: :profileable has_one :account, as: :accountableend
När du skapar fabrikerna för modellerna som har den polymorfa modellen skapar du helt enkelt den polymorfa modellen i ett after(:create)-block och anger polymorphicable som den modell som fabriken är till för:
FactoryBot.define do factory :user, class: User do # user attributes after(:create) do |user| create(:account, accountable: user) create(:profile, profileable: user) end endend
Och… det var allt! Tack för att du läste den här artikeln. Om du är intresserad av att läsa fler intressanta artiklar om Rails, se till att prenumerera på vårt nyhetsbrev! Intresserad av liknande ämnen? Se till att kolla in våra tankar om Rspec let vs before, Rspec Setup och FactoryGirl – create vs build vs buldstubbed.