2

Ich möchte FactoryGirl verwenden, um In-Memory-Stubs von Modellen zu erstellen, dann müssen alle ActiveRecord-Abfragen nur für diese ausgeführt werden. Zum Beispiel:Wie vermeide ich vollständig die Verwendung einer Datenbank in RSpec-Tests?

# Assume we start with an empty database, a Foo model, 
# and a Foo factory definition. 

#foo_spec.rb 
stubbed_foo = FactoryGirl.build_stubbed(:foo) 

# Elsewhere, deep in the guts of application 
Foo.first() # Ideally would return the stubbed_foo we created 
      # in the test. Currently this returns nil. 

Die Lösung könnte die Verwendung einer In-Memory-Datenbank sein. Aber ist das obige Szenario möglich?

+0

Wenn Sie keine Tabellen haben, dann gibt es kein Schema für Modelle, damit Ihr Stubbed-Modell sich wie jedes Objekt verhalten kann, ohne mit dem tatsächlichen Schema übereinstimmen zu müssen wird in der Produktion existieren. Das wäre wahrscheinlich eine schlechte Idee. Warum versuchen Sie ActiveRecord auf diese Weise zu umgehen? –

+0

Sie könnte Fixtures anstelle von Fabrik Mädchen – trueinViso

+0

@trueinViso Ich glaube nicht, Fixtures würde mein Problem zu lösen, wie die Foo-Klasse würde immer noch auf die Datenbank gehen beim Aufruf 'first()' oder eine andere Abfrage-Methode. –

Antwort

0

Wenn Sie die Datenbank vermeiden wollen, um Ihre Tests zu beschleunigen, gibt es bessere Möglichkeiten.

Verwenden Sie FactoryGirl.build so viel wie möglich statt create. Dies funktioniert, solange der Datensatz nicht von Ihrem Code aus der Datenbank abgerufen wird. Dies funktioniert gut für Komponententests mit gut strukturiertem Code. (Zum Beispiel hilft es Service Objects zu verwenden und Einheit testet sie unabhängig.

Für Tests, die tatsächlich aus der Datenbank lesen müssen (wie in Ihrem Foo.first Beispiel Call), können Sie FactoryGirl.create verwenden und Transaktions Vorrichtungen verwenden. Dies schafft eine Datenbank-Transaktion zu Beginn eines jeden Test Beispiel und rollt dann die Transaktion am Ende des Beispiels zurück. Dies kann zu Problemen führen, wenn Sie Rückrufe in Ihren Active Modellen wie after_commit verwenden.

Wenn Sie after_commit oder andere Rückrufe verwenden In Ihren Modellen, bei denen die Datenbanktransaktion geschlossen werden muss (oder Sie explizite Transaktionen in Ihrem Code verwenden), empfehle ich die Einrichtung von DatabaseCleaner Es gibt ein Beispiel für die Konfiguration und Verwendung: https://gist.github.com/RobinDaugherty/9f4e5f782d9fdbe191a23de30ad8b539

+0

Ja, meine Motivation ist es, die Testsuite schnell zu halten. Ich benutze 'FactoryGirl.build' und' FactoryGirl.build_stubbed' so viel wie möglich, aber ich suchte nach einer Möglichkeit, die Datenbankabhängigkeit vollständig zu beseitigen. Ich glaube nicht, dass transaktionale Geräte auch das erreichen werden, was ich will. Dies könnte ein Fall von vorzeitigen Optimierung meinerseits sein, aber ich wollte nur sicherstellen, dass es nicht möglich war, bevor ich schreibe Tests mit Datenbank-Interaktion. –

+0

Ich bezweifle, dass Sie von 'FactoryGirl.build' eine substantielle Steigerung der Geschwindigkeit sehen werden, um Stubs zu verwenden. Aber Sie werden auf jeden Fall die Qualität in Ihren Tests verlieren, da die Verwendung einer Modellfabrik dafür sorgt, dass das Modellverhalten korrekt ist. Ich würde es nicht empfehlen. –

Verwandte Themen