[RAILS] Hinweis beim Erstellen einer Viele-zu-Viele-Factory mit Rspec und Testen mit SystemSpec [RSpec, FactoryBot]

Hintergrund

Ich habe eine Viele-zu-Viele-Beziehung zu Rspec hergestellt und diese mit SystemSpec getestet. Aufgrund der Komplexität der ursprünglichen Tabellenstruktur hatte ich große Probleme, daher werde ich die folgenden Hinweise zusammenfassen.

Der Ausführungsabschluss ist wie folgt.

Tabellenstruktur

Die Tabellenstruktur sieht so aus. Die Haupttabellen sind "Büros" (eine Niederlassung eines Unternehmens) und "Geschäfte" (ein Geschäft, das ein Geschäftsziel ist), und "Büro" (eine Niederlassung) öffnet "evebt" und das Geschäft, das ein Geschäftsziel ist, kauft dort ein. `Mach mit. "Geschäfte" hat immer eine "Kategorie".

Image from Gyazo

Das Problem, das passiert ist

Aufgrund der Modellmethode brauchte ich, als ich eine "Fabrik" für "Events" herstellte, einen "Shop", der damit verbunden war. Aufgrund der Struktur habe ich jedoch einen Fehler erhalten, wenn ich es so geschrieben habe.

let!(:shop){FactoryBot.create(:shop)}
let!(:event){FactoryBot.create(:event)}
#=>Wenn hier kein Shop mit dem Ereignis verknüpft ist, tritt hier ein Fehler auf.
let!(:event_shops){FactoryBot.create(:event_shop, event: event, shop: shop)}

Problemumgehung

Aus diesem Grund habe ich beschlossen, eine Factory zu erstellen, die den zugehörigen "Shop" gleichzeitig mit der Erstellung der "Factory" von "Event" definieren kann.

Erstellen Sie eine Factory für Ereignisse

Die erstellte Factory lautet wie folgt.

spec/factories/events.rb


FactoryBot.define do
  factory :event do
    office_id { nil }
    name { "Testereignis" }
    
    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

Erstellen Sie zunächst ein Merkmal mit dem Namen "with_shops" in der Factory von "event", damit Sie beim Erstellen des "event" auch den zugehörigen "shop" erstellen können. Ermöglichen Sie das Erstellen mehrerer "Shop" -Fabriken mit "create_list" (nur eine, da hier nur eine benötigt wird) und "[event]", sodass mehrere Instanzen von "event" aus "events" eingegeben werden können. Notiert als `und ein Array.

Außerdem werde ich später erklären, dass "Kategorie" absichtlich mit "Merkmal" bezeichnet wird.

Machen Sie es in System Spec aufrufbar

spec/factories/categories.rb


FactoryBot.define do
  factory :category do
    name { "Medizinisches System" }

    trait :sequence do
      sequence(:id, 100)
      name { "Bekleidungssystem" }
    end
  end
end

spec/system/events_spec.rb


let!(:event) { FactoryBot.create(:event, :with_shops, office: office, shops: [shop]) }
#Sie können hier keine Kategorie zum Einkaufen anwenden

Als nächstes wird in der Factory von "Kategorie" "Ereignis" in der Ansicht mehrmals generiert. Wenn daher die gleichzeitig erzeugte "Kategorie" des "Shops" jedes Mal auf eine andere "ID" (FK) gesetzt werden muss, tritt ein doppelter FK-Fehler auf.

Wenn Sie versuchen, "Kategorie" von "Systemspezifikation" auf "Geschäfte" von "Ereignis" anzuwenden, wenn Sie versuchen, eine Fabrik für "Geschäft" in "Spezifikation / Fabriken / Ereignisse.rb" zu erstellen, " Der externe Schlüssel existiert nicht "und ich habe eine Fehlermeldung erhalten.

Daher habe ich versucht, nacheinander verschiedene id (FK) -Kategorien mit sequence zu erstellen.

Am Ende (Referenzseite usw.)

Die Lösung hat lange gedauert, aber ich bin froh, dass ich es geschafft habe, sie zu lösen! Dieses Mal war die Struktur der DB kompliziert, so dass ich eine so komplizierte Spezifikation schreiben musste, aber In Zukunft möchte ich das DB-Design festigen, damit einfachere Tests durchgeführt werden können. .. .. ..

▼ Artikel, auf die ich besonders Bezug genommen habe

Recommended Posts

Hinweis beim Erstellen einer Viele-zu-Viele-Factory mit Rspec und Testen mit SystemSpec [RSpec, FactoryBot]
(Ruby on Rails6) Erstellen einer Datenbank und Anzeigen in einer Ansicht
Führen Sie SystemSpec (RSpec) und Rubocop auf CircleCI aus
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung mit Rails 6 # 3 RSpec. FactoryBot wird eingeführt und ein Post-Modell erstellt
[Docker] Erstellen Sie eine Site mit Hugo und veröffentlichen Sie sie auf GitHub