Modelldatensätze und zugehörige Verzeichnisse synchron halten (mit Tests)

9

In meiner App erstelle ich ein Verzeichnis, wenn ich meinen Themensatz erstelle. Dies dient zum Speichern von Datei-Assets, die mit dem Thema zusammenhängen. Ich hatte immer Probleme damit, die Existenz des Verzeichnisses synchron mit dem Lebenszyklus des Datensatzes zu halten. Dies ist meine aktuelle Einstellung:

%Vor%

Es funktioniert gut, außer dass Rspec anscheinend das Entfernen des Verzeichnisses nicht auslöst, wenn Theme-Datensätze nach Tests zurückgesetzt werden.

Gibt es eine Best Practice für so etwas? Die Idee ist, dass man nie mit einem streunenden Verzeichnis ohne einen verknüpften Datensatz verlassen sollte.

    
Brendon Muir 30.11.2013, 09:08
quelle

2 Antworten

1

Der von Ihnen definierte after_rollback Callback wird nur aufgerufen, wenn das Erstellen, Zerstören oder Aktualisieren eines Datensatzes über ActiveRecord erfolgte. Wenn RSpec zurückgesetzt wird, durchläuft es ActiveRecord nicht, sodass es keine Transaktionsrückrufe auslöst (after_rollback und after_commit).

Sie könnten einen weiteren Rückruf hinzufügen, der das Verzeichnis zerstört, falls es noch existiert:

%Vor%

Und dann triggern Sie die Aktionen zum Erstellen und Zerstören in Ihrer Feature-Spezifikation:

%Vor%

Auf diese Weise lösen Sie die Aktionen zum Erstellen und Zerstören in Ihren Spezifikationen aus, sodass Sie keine Bereinigung durchführen müssen.

Die andere Option ist das manuelle Entfernen des Verzeichnisses in der Spezifikation, in der Sie die Erstellung testen.

%Vor%

Ich hoffe, das hilft.

    
Gjaldon 15.12.2013, 04:09
quelle
1

Wirklich interessante Frage, für die ich ein eigenes Interesse habe, da ich gerade eine Anwendung entwickle, in der Dateien hochgeladen und konvertiert werden.

Ich bin kein Experte für RSpec, aber ich denke, es ist sehr datenbankorientiert und überlässt es dem Benutzer, nach sich selbst aufzuräumen, wenn es nicht mit der Datenbank zusammenhängt (wie das Erstellen von Ordnern / Aktualisieren von Bildern / Initiieren eines externe Schnittstelle).

Dieses Beispiel zeigt, wie Sie nach (: all) für die Bereinigung mit RSepc und carrierwave Tests - ähnlich wie meine ersten.

Eine andere Alternative ist pragmatischer und wahrscheinlich begrenzter, wenn es um das Testen geht. Halten Sie eine Sicherungsdatei für Ihre Zielstruktur bereit und stellen Sie sie nach Abschluss der Tests wieder her.

Ich bin wirklich interessiert, wenn jemand eine bessere Methode hat.

Hoffe, das hilft! Eugen

    
smile2day 10.12.2013 23:09
quelle