2017-10-25 5 views
0

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

+0

Ich verstehe, was du meinst, aber ich würde sagen, seine kühle recht nicht zu viel Magie zu haben beteiligt :) – apneadiving

+0

„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

+0

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

Antwort

Verwandte Themen