Nach einer umfangreichen Fehlerbehebung stellte ich fest, dass ich rake spec
einmal ausführen musste (ich kann mit control-c abbrechen), bevor ich rspec direkt ausführen konnte (z. B. für eine Teilmenge unserer Spezifikationen). Wir verwenden Rails 3.0.7 und RSpec 2.5.0.
Es ist klar, dass Rake einige wichtige Datenbank-Setup-Aufgaben / -Code ausführt (wir haben benutzerdefinierten Code in den Rakefile-Rails der Root-Ebene und möglicherweise an anderen Stellen).
Wie kann ich die Setup-Aufgaben / den Code für die Rake-Test-Datenbank ausführen, ohne sie auszuführen rake spec
?
Zusätzlich zur Möglichkeit, rspec für eine Teilmenge von Dateien auszuführen , verwende ich specjour , um unsere Spezifikationen auf mehrere Kerne zu verteilen (ich hatte noch keinen Erfolg damit, sie über das LAN zu verteilen), aber ich sehe dasselbe Verhalten wie beim Ausführen von rspec direkt: Ich muss rake spec
auf jeder Testdatenbank (unter der Annahme von zwei Kernen) ausgeführt werden, bevor specjour funktioniert:
rake spec TEST_ENV_NUMBER=1
control-c (after tests start)
rake spec TEST_ENV_NUMBER=2
control-c (after tests start)
specjour
Hinweis: Meine config / database.yml hat diesen Eintrag zum Testen (wie es für die Edelsteine des parallelen Testens üblich ist):
test:
adapter: postgresql
encoding: unicode
database: test<%=ENV['TEST_ENV_NUMBER']%>
username: user
password:
parallel_tests scheint seine Datenbanken korrekt einzurichten, aber viele unserer Spezifikationen schlagen fehl.
Ich sollte auch erwähnen, dass das Ausführen specjour prepare
dazu führt, dass Postgres Fehler protokolliert, bei denen die Datenbanken nicht gefunden werden können, diese jedoch erstellt werden (ohne Tabellen). Bei einem nachfolgenden Lauf werden keine Fehler protokolliert, aber auch keine Tabellen erstellt. Es ist möglich, dass mein gesamtes Problem einfach ein Fehler ist prepare
, also habe ich es auf Github gemeldet.
Ich denke, dass ich beliebigen Code in jeder Specjour-Testdatenbank ausführen kann, indem ich Specjour::Configuration.prepare
.specjour / hooks.rb einstelle. Wenn also Rake-Tasks oder anderer Code ausgeführt werden müssen, funktioniert dieser möglicherweise dort.
Ich würde empfehlen, Ihre Testdatenbank zu löschen, sie dann neu zu erstellen und zu migrieren:
Nach diesen Schritten können Sie Ihre Spezifikationen ausführen:
gerry3 stellte fest, dass:
Wenn Sie jedoch PostgreSQL verwenden, funktioniert dies nicht, da die Rails-Umgebung geladen wird, wodurch eine Datenbankverbindung hergestellt wird. Dies führt dazu, dass der
prepare
Aufruf fehlschlägt, da die Datenbank nicht gelöscht werden kann. Knifflige Sache.quelle
rake db:test:prepare
.rake db:test:prepare
mit Postgres. Sie müssen Ihr Problem aus einem anderen Grund sehen.RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
rake db:test:prepare
in Rails 4 veraltet.bundle exec rake db:drop db:create db:schema:load RAILS_ENV=test
Die bereitgestellten Lösungen erfordern alle das Laden der Rails-Umgebung, was in den meisten Fällen aufgrund des sehr hohen Overheads und der sehr geringen Geschwindigkeit nicht das gewünschte Verhalten ist.
DatabaseCleaner
gem ist auch ziemlich langsam und fügt Ihrer App eine weitere Abhängigkeit hinzu.Nach Monaten des Ärgers und Ärgers aus den oben genannten Gründen habe ich endlich herausgefunden, dass die folgende Lösung genau das ist, was ich brauche. Es ist schön, einfach und schnell. In
spec_helper.rb
:Das Beste daran ist: Es werden nur die Tabellen gelöscht, die Sie effektiv berührt haben (unberührte Modelle werden nicht geladen und erscheinen daher nicht in
subclasses
, auch der Grund, warum dies vor den Tests nicht funktioniert ). Außerdem wird es nach den Tests ausgeführt, sodass die (hoffentlich) grünen Punkte sofort angezeigt werden.Der einzige Nachteil dabei ist, dass eine verschmutzte Datenbank vor dem Ausführen von Tests nicht bereinigt wird. Ich bezweifle jedoch, dass dies ein großes Problem ist, da die Testdatenbank normalerweise nicht von externen Tests berührt wird.
Bearbeiten
Da diese Antwort an Popularität gewonnen hat, wollte ich sie der Vollständigkeit halber bearbeiten: Wenn Sie alle Tabellen löschen möchten , auch die nicht berührten, sollten Sie in der Lage sein, so etwas wie die folgenden "Hacks" durchzuführen.
Hack 1 - Vorladen aller Modelle für die
subclasses
MethodeBewerten Sie dies, bevor Sie anrufen
subclasses
:Beachten Sie, dass diese Methode einige Zeit dauern kann!
Hack 2 - manuelles Abschneiden der Tabellen
Sie erhalten alle Tabellennamen, mit denen Sie Folgendes tun können:
quelle
Es scheint, dass in Rails 4.1+ die beste Lösung darin besteht, einfach
ActiveRecord::Migration.maintain_test_schema!
Ihren rails_helper nachher hinzuzufügenrequire 'rspec/rails'
.Das heißt, Sie müssen sich keine Sorgen mehr machen, dass Sie die Datenbank vorbereiten müssen.
https://relishapp.com/rspec/rspec-rails/docs/upgrade#pending-migration-checks
quelle
In einer frühlingshaften Rails 4-App wird meine
bin/setup
normalerweise erweitert, um sie zu enthaltenDies ist sehr ähnlich zu Leviathans Antwort und der Aussaat der Test-DB als
Wie der Kommentar erwähnt,
rake db:reset
tut dies genau das , wenn wir die Datenbank zuerst löschen möchten .Ich finde auch, dass dies im Vergleich zu mehr Feedback liefert
rake db:test:prepare
.quelle
Ich begann damit, meine Testdatenbank zu löschen
rake db:drop RAILS_ENV=test
Beim Versuch, eine neue Testdatenbank zu erstellen, ist ein Problem aufgetreten, da mein Benutzerkonto nicht mit dem Konto identisch war, dem die Datenbanken gehören. Daher habe ich die Datenbank stattdessen in PostgreSQL erstellt.
Geben Sie
psql
die Eingabeaufforderung ein und führen Sie die folgenden Schritte aus, um eine Testdatenbank zu erstellen, die ein anderes Konto als Ihr eigenes verwendet.CREATE DATABASE your_database_name OWNER your_db_owner;
Führen Sie dann Ihre Migrationen in der Testumgebung aus.
rake db:migrate RAILS_ENV=test
quelle