Как загрузить фикстуры seed_fu перед тестированием с помощью rspec?

Я пытаюсь настроить rspec для тестирования в своем приложении rails. Я создал образец теста и выполнил rake rspec --trace.

В выводе я вижу это сообщение

** Invoke spec:models (first_time)
** Invoke db:test:prepare (first_time)
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:abort_if_pending_migrations
** Execute db:test:prepare
** Invoke db:test:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke environment 
** Execute db:test:purge
** Execute db:test:load
** Invoke db:schema:load (first_time)
** Invoke environment 
** Execute db:schema:load

Схема загружается, а затем задача rake прерывается, потому что я пытаюсь использовать некоторые значения из базы данных в одном из файлов в каталоге инициализаторов. Обычно эти записи находятся в базе данных, все они присутствуют в файлах seed_fu в каталоге db/fixtures.

Я ищу способ выполнить эти файлы после db:schema:load. Кто-нибудь знает, как это сделать?


person Adrian Serafin    schedule 11.01.2012    source источник


Ответы (3)


Похоже, вы можете получить доступ к сеялке напрямую, просто вызвав SeedFu.seed.

Преимущество этого заключается в том, что семена запускаются в правильном порядке, и, если вам нужно, вы можете передавать аргументы для определенных путей фикстур или параметров фильтрации — я мог видеть, что использование определенного пути полезно, например, для тестовых фикстур.

Вот метод seed-fu:

# Load seed data from files
# @param [Array] fixture_paths The paths to look for seed files in
# @param [Regexp] filter If given, only filenames matching this expression will be loaded
def self.seed(fixture_paths = SeedFu.fixture_paths, filter = nil)
  Runner.new(fixture_paths, filter).run
end

Я понятия не имею, предназначен ли этот метод для публичного использования, но на данный момент, по крайней мере, он хорошо работает для моих целей.

person Nerdmaster    schedule 31.01.2012
comment
Я также должен упомянуть, что вызов SeedFu.seed имеет смысл в вызове before(:suite), чтобы максимизировать ценность сидов при минимизации трафика БД. - person Nerdmaster; 31.01.2012

Я придумал приемлемое, но не идеальное решение. Я удалил ссылку на базу данных из файла инициализатора и заменил ее простым целочисленным назначением. Чтобы загрузить свои семена, я добавил эту строку в spec_helper.rb

Dir[Rails.root.join("db/fixtures/*.rb")].each {|file| load file }
person Adrian Serafin    schedule 11.01.2012

Вы можете запустить это в тестах rspec перед запуском:

`rake db:seed_fu`

or

`rake db:seed_fu FILTER=locales`

и после испытаний

`rake db:reset`

Обратите внимание на волшебные кавычки - ``

Пример:

describe "POST /v1/products" do
  before(:all) do
    `rake db:seed_fu FILTER=4_locales`
  end

  after(:all) do
    `rake db:reset`
  end

  ...
end
person Vitaly Liber    schedule 08.11.2016