2013-06-17 7 views
41

On Rails 4.0.0.rc1 Ruby 2.0.0, nachdem ich eine Migration ausführen, ich folgende Fehlermeldung angezeigt, wenn ich einen Test durch rspec versuchen zu laufen:Warum soll ich 'rake db: migrate RAILS_ENV = test' ausführen?

/Users/peeja/.rbenv/ Versionen/2.0.0-p0/lib/ruby ​​/ edelsteine ​​/ 2.0.0/edelsteine ​​/ activecord-4.0.0.rc1/lib/aktive_aufzeichnung/migration.rb: 376: in `check_pending! ': Migrationen sind ausstehend; run 'rake db: migrate RAILS_ENV = test', um dieses Problem zu lösen. (ActiveRecord :: PendingMigrationError)

Das scheint nicht richtig. Niemand migriert seine Testdatenbank, oder? Sie db:test:prepare es, die - um fair zu sein - ich habe vergessen zu tun. Also starte ich rake db:test:prepare und führe meinen rspec Befehl erneut ... und sehe den gleichen Fehler.

Wenn ich eigentlich rake db:migrate RAILS_ENV=test, der Fehler geht tatsächlich weg.

Was ist los? Ist das neu in Rails 4?

+0

Funktioniert 'Rake db: test: prepare'? – itsnikolay

+2

Für mich 'Rake db: test: prepare' funktioniert nicht, auch wenn' schema.rb' auf dem neuesten Stand ist. Nur die Migration der Testdatenbank funktioniert. – Kris

+0

Kasse meine Antwort hier, hoffe es hilft: http://StackOverflow.com/a/33054787/4902373 –

Antwort

53

Ab Rails 4.1, die rake db:test:* Aufgaben sind veraltet. Stattdessen sollten Sie Ihre (test|spec)_helper.rb umfassen:

ActiveRecord::Migration.maintain_test_schema! 

Dies bedeutet, dass Ihre Testdatenbank jedes Mal Ihre Tests laufen bekommen das korrekte Schema, ob Sie sie von einem Rake-Task ausführen oder nicht.

+0

Vielen Dank für dieses eine, ich habe das tatsächlich vermisst, als 4.1 veröffentlicht wurde, denke ich. – jipiboily

+1

Dies ist korrekt und ist der beste Weg, um Ihre Testdatenbank auf dem neuesten Stand zu halten. Der Fehler besteht darin, dass Sie ausstehende Migrationen ausführen müssen. Aber wenn jemand dieser großen Problemumgehung nicht folgen möchte, schlage ich vor, dass Sie die Testdatenbank löschen und neu ausführen 'rake db: create RAILS_ENV = test', um Ihre Testdatenbank neu zu erstellen, und den Lauf' rake db: migrate RAILS_ENV = test 'nur um die Testdatenbank zu migrieren. Ich mache das oft, wenn ich noch Tests für meine Bewerbung schreiben muss. –

+1

Ich kann diese Zeile in 'tests_helper.rb' in den Schienen 5 out of box – Abhilash

23

Sieht aus wie rake test:prepare funktioniert, nicht sicher, was db:test:prepare jetzt tut.

+0

Wow. Schlag es auf den Kopf. Vielen Dank! https://gist.github.com/Peeja/5831155 Jetzt um einen Rails Bug zu archivieren ... – Peeja

+1

Huh. Als ich das erste Mal gepostet habe, habe ich diesen 'test: prepare' * verpasst * ruft (abhängig von)' db: test: prepare'. All die guten Sachen scheinen jedoch außerhalb von 'db: test: prepare' zu ​​passieren. Hier ist der Rails-Code: https://github.com/rails/rails/blob/067e1505d4e054df566e065f4faf11ee4b430a3d/activerecord/lib/active_record/railties/databases.rake#L399 – Peeja

+0

Es sieht so aus, als ob die Datenbank aus 'schema.rb' in 'erstellt wurde db: test: load' welche 'test: prepare' Aufrufe nach' db: test: prepare'. Aber es sieht auch so aus, dass 'db: test: load' direkt von' db: test: prepare' aufgerufen wird. – Kris

5

können Sie auch versuchen,

rake db:migrate RAILS_ENV=test 

die

arbeitet als
db:test:prepare 

tut :)

+5

Es ist eigentlich nicht. 'rake db: migrieren RAILS_ENV = test' wird die Testdatenbank migrieren. 'rake db: test: prepare' lädt (würde) das Schema in die Testdatenbank, die schneller und weniger fehleranfällig ist. – Peeja

9

Ich habe immer noch Probleme bei der Sortierung dieses Problems, wenn ich nur der Antwort einer Person folge, also habe ich ein paar zusammengewürfelt, um bessere Ergebnisse zu erzielen. Hier sind die Schritte, die ich mache, nicht sicher, welche sind unnötig, aber es funktioniert am Ende.

  1. fügen Sie ActiveRecord::Migration.maintain_test_schema! an den Anfang der Datei test_helper.rb.
  2. rake test:prepare
  3. rake db:migrate
  4. rake db:migrate RAILS_ENV=test

Dann, wenn ich bundle exec rake test laufen bekomme ich jedes Mal, saubere Ergebnisse ohne anstehenden Migrationen. (Das mache ich direkt nach dem ersten Erzeugen des Gerüsts). Jemand kann mich korrigieren, wenn Sie sicher sind, dass einer dieser Schritte absolut nicht notwendig ist, aber so stelle ich sicher, dass es jedes Mal funktioniert.

1

Ich habe festgestellt, dass ich dieses Problem habe, wenn ich chruby verwende, um meine Rubin-Versionen zu verwalten. Rails ruft bin/rails db:test:prepare über den Systembefehl auf. Dies nutzt nicht chrubys $PATH env var, so läuft es als was auch immer das System Ruby ist, und scheitert wegen der fehlenden Edelsteine ​​in der Regel.Leider habe ich zur Zeit keine gute Lösung dafür.

+1

Wow, wie hast du es herausgefunden? Ich benutze auch 'chruby' und' ActiveRecord :: Migration.maintain_test_schema! 'Funktioniert einfach nicht für mich. Wie hast du es debuggen? Irgendwelche Korrekturen? –

2

Sie können versuchen, die Variable VORHER Befehl wie folgt zu setzen. Diese Aussage löste mein Problem:

RAILS_ENV=test rake db:migrate 
+2

Dies beantwortet die Frage nicht. Die Frage ist: Warum müssen wir diese Migration ausführen und nicht wie der Fehler behoben wird? – Ievgen

Verwandte Themen