[RAILS] Remarque lors de la création d'une usine plusieurs-à-plusieurs avec Rspec et des tests avec SystemSpec [RSpec, FactoryBot]

Contexte

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.

Structure de la table

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».

Image from Gyazo

Le problème qui se passait

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)}

solution de contournement

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.

Créer une usine pour les événements

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».

Rendre appelable dans les spécifications système

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.

À la fin (site de référence, etc.)

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

Remarque lors de la création d'une usine plusieurs-à-plusieurs avec Rspec et des tests avec SystemSpec [RSpec, FactoryBot]
(Ruby on Rails6) Créer une base de données et l'afficher dans une vue
Exécutez SystemSpec (RSpec) et Rubocop sur CircleCI
Créez une API de tableau d'affichage avec certification et autorisation avec Rails 6 # 3 RSpec, FactoryBot introduit et post-modèle
[Docker] Créez un site avec Hugo et publiez-le sur GitHub