Próbuję użyć nowego standardowego sposobu ładowania danych początkowych w Railsach 2.3.4+, db:seed
zadaniu rake.
Ładuję stałe dane, które są wymagane, aby moja aplikacja naprawdę działała poprawnie.
Jaki jest najlepszy sposób uruchomienia db:seed
zadania przed testami, aby dane zostały wstępnie wypełnione?
ruby-on-rails
testing
seed
Luke Francl
źródło
źródło
test_helper.rb
nie zadziałało, chociaż stackoverflow.com/a/1998520/68210 tak.Rails.application.load_seed
tuż podrequire 'rspec/rails'
moim pliku rails_helper. Jeśli używasz klejnotu database_cleaner - będzie to wymagało drobnych poprawek, aby upewnić się, że nie stracisz danych z nasion po każdym teście i możesz to znaleźć w dokumentacji gem it selftest/test_helper.rb
po istniejącejrequire 'rails/test_help'
liniiPowiedziałbym, że tak powinno być
Ponieważ db: test: load nie jest wykonywany, jeśli masz config.active_record.schema_format =: sql (db: test: clone_structure to)
źródło
--trace
pomogło mi zrozumieć, jak to działa.task 'db:test:prepare' => 'db:seed'
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
przedRake::Task["db:seed"].invoke
db:seed
uruchomieniu jestdevelopment
... dziwne.Umieszczenie czegoś takiego w lib / task / test_seed.rake powinno wywołać zadanie seed po db: test: load:
źródło
Uważam, że powyższy komentarz Steve'a powinien być poprawną odpowiedzią. Możesz użyć
Rails.application.load_seed
do załadowania danych nasion do środowiska testowego. Jednak to, kiedy i jak często te dane są ładowane, zależy od kilku rzeczy:Korzystanie z programu Minitest
Nie ma wygodnego sposobu na jednorazowe uruchomienie tego pliku przed wszystkimi testami (zobacz ten problem na Githubie ). Będziesz musiał załadować dane raz przed każdym testem, prawdopodobnie w metodzie konfiguracji plików testowych:
Korzystanie z RSpec
Użyj
before(:all)
metody RSpec, aby załadować dane początkowe dla wszystkich testów dla tego modelu:Mam nadzieję że to pomoże.
źródło
before(:suite)
zamiastbefore(:all)
. Wysłałem osobną odpowiedź zawierającą sformatowany kod.Wywołujemy db: seed jako część db: test: ready, z:
Rake::Task["db:seed"].invoke
W ten sposób dane początkowe są ładowane raz na cały przebieg testu, a nie raz na klasę testową.
źródło
Dla tych, którzy używają banku nasion, zmienia sposób ładowania nasion, więc prawdopodobnie nie możesz / nie chcesz korzystać z
load ...
rozwiązania przedstawionego tutaj.Rake::Task['db:seed'].invoke
Samo wprowadzenie do test_helper zaowocowało:Ale kiedy dodaliśmy wcześniej load_tasks, zadziałało:
źródło
Dodawanie
Rake::Task["db:seed"].invoke
dodb:test:prepare
zadania prowizji nie działa dla mnie. Jeśli przygotowałem bazę danych za pomocąrake db:test:prepare
, a następnie wszedłem do konsoli w środowisku testowym, wszystkie moje nasiona były tam. Jednak nasiona nie przetrwały między moimi testami.Dodanie
load "#{Rails.root}/db/seeds.rb"
do mojej metody konfiguracji działało jednak dobrze.Chciałbym, aby te nasiona ładowały się automatycznie i utrzymywały się, ale nie znalazłem jeszcze sposobu, aby to zrobić!
źródło
Opierając się na odpowiedź Matta, jeśli przy tego rodzaju trasy, polecam dzwoniąc
Rails.application.load_seed
wbefore(:suite)
bloku wrspec_helper.rb
zamiast wbefore(:all)
bloku w każdym pliku. W ten sposób kod inicjujący jest wywoływany tylko raz dla całego zestawu testów, a nie raz dla każdej grupy testów.rspec_helper.rb:
źródło