J'ai établi une relation plusieurs-à-plusieurs avec Rspec et l'ai testée avec SystemSpec. En raison de la complexité de la structure originale du tableau, j'ai eu beaucoup de problèmes, je vais donc résumer les notes ci-dessous.
La fin de l'exécution est la suivante.
La structure du tableau ressemble à ceci. Les tables principales sont les «bureaux» (une succursale d'une entreprise) et les «magasins» (un magasin qui est une destination commerciale), et «office» (succursale) ouvre «evebt »et il y a des magasins. Rejoignez. «shops» a toujours une «catégorie».
En raison de la méthode du modèle, lorsque j'ai créé l '«usine» des «événements», j'avais besoin des «boutiques» associées. Cependant, en raison de la structure, si je l'ai écrit comme ça, j'ai eu une erreur.
let!(:shop){FactoryBot.create(:shop)}
let!(:event){FactoryBot.create(:event)}
#=>Ici, s'il n'y a pas de boutique associée à l'événement, une erreur se produira.
let!(:event_shops){FactoryBot.create(:event_shop, event: event, shop: shop)}
Par conséquent, j'ai décidé de créer une usine qui peut définir la boutique
associée en même temps que la
fabrique de ʻevent
est créée.
L'usine créée est la suivante.
spec/factories/events.rb
FactoryBot.define do
factory :event do
office_id { nil }
name { "Événement test" }
trait :with_shops do
after(:create) do |event|
category = FactoryBot.create(:category, :sequence)
create_list(:shop, 1, events: [event], category: category)
end
end
end
end
Tout d'abord, créez un trait appelé with_shops
dans la fabrique de ʻevent afin que vous puissiez également créer la
boutique associée lorsque vous créez ʻevent
. Rendez possible la création de plusieurs usines shop
avec create_list
(une seule car une seule est nécessaire ici), et [event] pour que plusieurs instances de ʻevent
puissent être entrées à partir des ʻevents`. Noté comme ʻet un tableau.
De plus, j'expliquerai plus tard que «catégorie» est délibérément appelée en utilisant «trait».
spec/factories/categories.rb
FactoryBot.define do
factory :category do
name { "Système médical" }
trait :sequence do
sequence(:id, 100)
name { "Système de vêtements" }
end
end
end
spec/system/events_spec.rb
let!(:event) { FactoryBot.create(:event, :with_shops, office: office, shops: [shop]) }
#Vous ne pouvez pas appliquer la catégorie pour acheter à partir d'ici
Ensuite, dans la fabrique de category
, ʻevent` est généré plusieurs fois dans la vue. Par conséquent, si la «catégorie» de la «boutique» générée en même temps doit être définie sur un «id» (FK) différent à chaque fois, une erreur FK dupliquée se produira.
De plus, lorsque vous essayez d'appliquer «catégorie» de «spécification système» aux «boutiques» de «événement», lorsque vous essayez de créer une usine pour «boutique» dans «spec / factories / events.rb», " La clé externe n'existe pas »et j'ai eu une erreur.
Par conséquent, en utilisant sequence
, j'ai essayé de créer différentes catégories de ʻid` (FK) une par une.
Cela a pris du temps à résoudre, mais je suis content d'avoir réussi à le résoudre! Cette fois, la structure de la base de données était compliquée, j'ai donc dû écrire une spécification aussi compliquée, mais À l'avenir, j'aimerais consolider la conception de la base de données afin que des tests plus simples puissent être effectués. .. .. ..
▼ Articles auxquels j'ai fait référence en particulier
Recommended Posts