Dans cet article, nous allons passer en revue comment générer les données pour les associations has_one, has_many et polymorphes en utilisant FactoryGirl. Chaque association sera décrite avec un exemple, afin que vous puissiez avoir l’idée de comment créer des usines plus complexes sans douleur.
Générer les données pour l’association has_one
Mettre en place l’association has_one est assez facile, vous pouvez la définir dans l’usine. Si le nom de la fabrique est le même que celui de l’association, le nom de la fabrique peut être laissé de côté. Par exemple:
FactoryBot.define do factory :story do # story attributes author endend
Aussi, vous pouvez spécifier une usine différente et remplacer les attributs:
FactoryBot.define do factory :story do # story attributes association :author, factory: :user, first_name: "Jon" endend
Il est possible de spécifier différentes stratégies pour créer l’association:
association :author, factory: :user, strategy: :build
N’oubliez pas que cela ne sauvegardera pas un objet associé dans la base de données.
Générer les données pour une association has_many
Générer les données pour une association has_many est un peu plus compliqué. Vous pouvez définir une nouvelle usine et utiliser le callback after(:create) pour créer une liste d’associations. Voyons comment le faire dans cet exemple:
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
L’attribut stories_count est un transitoire et disponible dans les attributs de la fabrique et dans le callback via l’évaluateur. Maintenant, vous pouvez créer un utilisateur avec des histoires avec la possibilité de spécifier combien d’histoires nous voulons:
create(:user_with_stories).stories.length # 10create(:user_with_stories, stories_count: 15).stories.length # 15
Veuillez noter que chaque histoire aura un id unique, mais pour que les autres attributs soient uniques, vous devez générer des valeurs différentes pour chaque histoire.
Vous pouvez réaliser cela en utilisant la séquence comme exemple:
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
Il y a aussi une gemme intéressante qui peut vous aider à générer des valeurs uniques appelée faker.
Générer les données pour les associations polymorphes
Une association polymorphe peut être un peu confuse. Espérons que cet exemple vous aidera à mieux la comprendre. Disons que vous avez les classes suivantes avec des associations polymorphes:
class Profile belongs_to :profileable, polymorphic: trueendclass Account belongs_to :accountable, polymorphic: trueendclass User has_one :profile, as: :profileable has_one :account, as: :accountableend
Lorsque vous créez les fabriques pour les modèles qui ont le modèle polymorphe, vous créez simplement le modèle polymorphe dans un bloc after(:create) et spécifiez le polymorphique pour être le modèle pour lequel la fabrique est destinée:
FactoryBot.define do factory :user, class: User do # user attributes after(:create) do |user| create(:account, accountable: user) create(:profile, profileable: user) end endend
Et.. c’est tout !
Merci d’avoir lu cet article.
Si vous êtes intéressé par la lecture d’autres articles intéressants sur Rails, assurez-vous de vous abonner à notre newsletter !
Intéressé par des sujets similaires ? Assurez-vous de consulter notre prise sur Rspec let vs before, Rspec Setup et FactoryGirl – create vs build vs buldstubbed.