hatte ich eine Fabrik wie folgt aus:FactoryGirl: wie geht es um die Anwesenheitsvalidierung hinter den Kulissen?
FactoryGirl.define do
factory :product do
name 'John'
end
end
Ich habe eine Menge von Spezifikationen dieses Werk wie folgt aus:
product = create :product
ich jetzt eine Product belongs_to :user
Vereinigung aufgenommen und validieren es auf das Vorhandensein:
class Product < ApplicationRecord
validates :user, presence: true
end
Ich müsste alle meine Factory-Anrufe wie folgt jetzt (oder etwas ähnliches) umgestalten:
product = create :product, user: create(:user)
Das scheint mir eine Hektik. Ich möchte, dass FactoryGirl das automatisch für mich erledigt. Es soll wie folgt sein:
- Jedes Mal, wenn ein Produkt zu schaffen, factory fügt automatisch den Benutzer:
- Wenn es bereits ein Benutzer in der DB, ordnet es den Benutzer
- Wenn kein Benutzer ist in die DB ist ein erstellt
ein guter Weg, dies zu tun, ist es? Ich möchte verhindern, dass die DB die Existenz eines Benutzers abfragt, wenn ein Produkt erstellt wird.
Auch könnte es gefährlich sein, da ein vorhandener Benutzer während eines Tests zerstört werden könnte und dann für jedes nachfolgende erstellte Produkt fehlen würde.
Gibt es dafür bessere Muster?
Ich habe die ID anstelle des Objekts gesehen Sachen wie Validierung:
validates :user_id, presence: true
Und dann einfach eine nicht existierende ID zuweisen, wenn Sie das Objekt erstellen:
product = create :product, user_id: 123456
Ist das eine gute Muster?
Alle meine tief verschachtelten/assoziierten Ressourcen sollten bald eine belongs_to :user
Assoziation haben. Ich möchte vermeiden, user: create(:user)
(oder user: @user
) überall in meinen Spezifikationen zu schreiben.
Ich bin mir sicher, dass es dafür ein bewährtes Muster gibt ...?
Ich verstehe, was du meinst, aber ich würde sagen, seine kühle recht nicht zu viel Magie zu haben beteiligt :) – apneadiving
„Auch könnte es gefährlich sein, wie ein vorhandener Benutzer während eines zerstört werden könnte Test und dann würde zu jedem nachfolgenden geschaffenen Produkt fehlen."Das ist der falsche Weg, darüber nachzudenken. Sie sollten database_cleaner verwenden, um die gesamte Datenbank zwischen den Tests zu bereinigen. Selbst mit Fixtures würden Sie eine Transaktion verwenden, um ein Rollback durchzuführen. Daten zwischen den Tests zu behalten ist gefährlich, da es Probleme bei der Bestellung geben kann Pass nur, wenn sie nacheinander ausgeführt werden.) – max
Und nein - es sollte nicht so sein, wie du denkst.Fabriken sollten einzigartige Instanzen von Modellen erstellen.Sie sollten keine andere Ausgabe geben, die durch den externen Zustandbestimmt ist (welche Modelle existieren bereits). – max