Ich versuche, die neue Standardmethode zum Laden von Seed-Daten in Rails 2.3.4+, der db:seed
Rake-Aufgabe, zu verwenden.
Ich lade konstante Daten, die erforderlich sind, damit meine Anwendung wirklich richtig funktioniert.
Was ist der beste Weg, um die db:seed
Aufgabe vor den Tests auszuführen, damit die Daten vorab ausgefüllt werden?
ruby-on-rails
testing
seed
Luke Francl
quelle
quelle
test_helper.rb
nicht funktioniert, obwohl stackoverflow.com/a/1998520/68210 dies tat.Rails.application.load_seed
direktrequire 'rspec/rails'
in meine Datei rails_helper eingefügt. Wenn Sie database_cleaner gem verwenden, müssen Sie einige Anpassungen vornehmen, um sicherzustellen, dass Sie Ihre Seed-Daten nicht nach jedem Test verlieren.test/test_helper.rb
nach der bestehendenrequire 'rails/test_help'
Zeile hinzugefügtIch würde sagen, es sollte sein
Weil db: test: load nicht ausgeführt wird, wenn Sie config.active_record.schema_format =: sql haben (db: test: clone_structure ist)
quelle
--trace
half mir zu verstehen, wie das funktioniert.task 'db:test:prepare' => 'db:seed'
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
beforeRake::Task["db:seed"].invoke
db:seed
läuft istdevelopment
... bizarr.Wenn Sie so etwas in lib / task / test_seed.rake einfügen, sollte die Startaufgabe nach db: test: load: aufgerufen werden.
quelle
Ich glaube, Steves Kommentar oben sollte die richtige Antwort sein. Sie können
Rails.application.load_seed
damit Seed-Daten in Ihre Testumgebung laden. Wann und wie oft diese Daten geladen werden, hängt jedoch von einigen Faktoren ab:Verwenden von Minitest
Es gibt keine bequeme Möglichkeit, diese Datei vor allen Tests einmal auszuführen (siehe dieses Github-Problem ). Sie müssen die Daten vor jedem Test einmal laden, wahrscheinlich in der Setup-Methode Ihrer Testdateien:
RSpec verwenden
Verwenden Sie die RSpec-
before(:all)
Methode, um Startdaten für alle Tests für dieses Modell zu laden:Hoffe das hilft.
quelle
before(:suite)
anstelle von aufrufebefore(:all)
. Veröffentlichte eine separate Antwort mit formatiertem Code.Wir rufen db: seed als Teil von db: test: prepare auf, mit:
Rake::Task["db:seed"].invoke
Auf diese Weise werden die Startdaten einmal für den gesamten Testlauf und nicht einmal pro Testklasse geladen.
quelle
Für diejenigen, die eine Samenbank verwenden, ändert sich die Art und Weise, wie Samen geladen werden, sodass Sie
load ...
die hier bereitgestellte Lösung wahrscheinlich nicht verwenden können / wollen .Und nur das
Rake::Task['db:seed'].invoke
Einfügen in test_helper führte zu:Aber als wir zuvor load_tasks hinzugefügt haben, hat es funktioniert:
quelle
Das Hinzufügen
Rake::Task["db:seed"].invoke
zurdb:test:prepare
Rechenaufgabe hat bei mir nicht funktioniert. Wenn ich die Datenbank mit vorbereitetrake db:test:prepare
und dann die Konsole in der Testumgebung aufgerufen habe, waren alle meine Seeds vorhanden. Die Samen blieben jedoch zwischen meinen Tests nicht bestehen.Das Hinzufügen
load "#{Rails.root}/db/seeds.rb"
zu meiner Setup-Methode hat jedoch gut funktioniert.Ich würde gerne diese Samen automatisch laden und bestehen lassen, aber ich habe noch keinen Weg gefunden, dies zu tun!
quelle
Aufbauend auf Matts Antwort empfehle ich, wenn Sie diese Art von Route wählen,
Rails.application.load_seed
einenbefore(:suite)
Block inrspec_helper.rb
und nicht einenbefore(:all)
Block in einer Datei aufzurufen . Auf diese Weise wird der Seeding-Code nur einmal für die gesamte Testsuite und nicht einmal für jede Testgruppe aufgerufen.rspec_helper.rb:
quelle