Я пытаюсь использовать новый стандартный способ загрузки исходных данных в Rails 2.3.4+ - db:seed
задачу rake.
Я загружаю постоянные данные, которые необходимы моему приложению для правильной работы.
Как лучше всего запустить db:seed
задачу перед тестами, чтобы данные были предварительно заполнены?
ruby-on-rails
testing
seed
Люк Франкл
источник
источник
test_helper.rb
не сработало для меня, хотя stackoverflow.com/a/1998520/68210 сработал .Rails.application.load_seed
прямоrequire 'rspec/rails'
в свой файл rails_helper. Если вы используете гем database_cleaner - потребуется небольшая настройка, чтобы убедиться, что вы не потеряете свои исходные данные после каждого теста, и вы можете найти это в документации на сам гемtest/test_helper.rb
после существующейrequire 'rails/test_help'
строкиЯ бы сказал, что это должно быть
Потому что db: test: load не выполняется, если у вас есть config.active_record.schema_format =: sql (db: test: clone_structure is)
источник
--trace
помогло мне понять, как это работает.task 'db:test:prepare' => 'db:seed'
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
передRake::Task["db:seed"].invoke
db:seed
проходит вdevelopment
... удачливый.Помещение чего-то подобного в lib / tasks / test_seed.rake должно вызывать начальную задачу после db: test: load:
источник
Я считаю, что приведенный выше комментарий Стива должен быть правильным ответом. Вы можете использовать его
Rails.application.load_seed
для загрузки исходных данных в тестовую среду. Однако то, когда и как часто загружаются эти данные, зависит от нескольких вещей:Использование Minitest
Нет удобного способа запустить этот файл один раз перед всеми тестами (см. Этот выпуск Github ). Вам нужно будет загружать данные один раз перед каждым тестом, вероятно, в методе настройки ваших тестовых файлов:
Использование RSpec
Используйте
before(:all)
метод RSpec для загрузки исходных данных для всех тестов для этой модели:Надеюсь это поможет.
источник
before(:suite)
вместоbefore(:all)
. Отправил отдельный ответ, чтобы включить отформатированный код.Мы вызываем db: seed как часть db: test: prepare с помощью:
Rake::Task["db:seed"].invoke
Таким образом, исходные данные загружаются один раз за весь тестовый прогон, а не один раз за тестовый класс.
источник
Для тех, кто использует банк семян, он меняет способ загрузки семян, поэтому вы, вероятно, не сможете / не захотите использовать
load ...
предлагаемое здесь решение.И просто ввод
Rake::Task['db:seed'].invoke
в test_helper привел к:Но когда мы добавили load_tasks перед этим, это сработало:
источник
Добавление
Rake::Task["db:seed"].invoke
вdb:test:prepare
задачу рейка у меня не получилось. Если я подготовил базу данных с помощьюrake db:test:prepare
, а затем вошел в консоль в тестовой среде, все мои семена были там. Однако между моими испытаниями семена не сохранялись.Однако добавление
load "#{Rails.root}/db/seeds.rb"
к моему методу настройки сработало.Я бы хотел, чтобы эти семена загружались автоматически и сохранялись, но я еще не нашел способа сделать это!
источник
Основываясь на ответе Мэтта, если вы выберете такой маршрут, я рекомендую звонить
Rails.application.load_seed
вbefore(:suite)
блок,rspec_helper.rb
а не вbefore(:all)
блоке в любом файле. Таким образом, код заполнения вызывается только один раз для всего набора тестов, а не один раз для каждой группы тестов.rspec_helper.rb:
источник