Как загрузить db: исходные данные в тестовую базу данных автоматически?
Я пытаюсь использовать новый стандартный способ загрузки семенных данных в Rails 2.3.4+, db:seed
rake task.
Я загружаю постоянные данные, необходимые для правильной работы моего приложения.
Как лучше всего запустить задачу db:seed
перед тестами, поэтому данные предварительно заполнены?
Ответы
Ответ 1
Задача db:seed
rake в первую очередь просто загружает скрипт db/seeds.rb
Поэтому просто запустите этот файл для загрузки данных.
load "#{Rails.root}/db/seeds.rb"
# or
Rails.application.load_seed
Место размещения зависит от того, какую среду тестирования вы используете, и хотите ли вы, чтобы она загружалась перед каждым тестом или только один раз в начале. Вы можете поместить его в вызов setup
или в файл test_helper.rb
.
Ответ 2
Я бы сказал, что это должно быть
namespace :db do
namespace :test do
task :prepare => :environment do
Rake::Task["db:seed"].invoke
end
end
end
Поскольку db: test: load не выполняется, если у вас есть config.active_record.schema_format =: sql (db: test: clone_structure is)
Ответ 3
Поместите что-то вроде этого в lib/tasks/test_seed.rake, чтобы вызвать начальную задачу после db: test: load:
namespace :db do
namespace :test do
task :load => :environment do
Rake::Task["db:seed"].invoke
end
end
end
Ответ 4
Я считаю, что комментарий Стива выше должен быть правильным ответом. Вы можете использовать Rails.application.load_seed
для загрузки начальных данных в вашу тестовую среду. Однако когда и как часто эти данные загружаются, зависит от нескольких вещей:
Использование Minitest
Нет удобного способа запустить этот файл один раз перед всеми тестами (см. Эту проблему на Github). Вам нужно будет загрузить данные один раз перед каждым тестом, вероятно, в методе установки ваших тестовых файлов:
# test/models/my_model_test.rb
class LevelTest < ActiveSupport::TestCase
def setup
Rails.application.load_seed
end
# tests here...
end
Использование RSpec
Используйте метод RSpec before(:all)
для загрузки начальных данных для всех тестов для этой модели:
describe MyModel do
before(:all) do
Rails.application.load_seed
end
describe "my model..." do
# your tests here
end
Надеюсь это поможет.
Ответ 5
Мы вызываем db: seed как часть db: test: prepare, with:
Rake::Task["db:seed"].invoke
Таким образом, данные семени загружаются один раз для всего тестового прогона, а не один раз для каждого тестового класса.
Ответ 6
Для тех, кто использует seedbank, он изменяет загрузку семян, поэтому вы, вероятно, не можете/не хотите использовать предлагаемое здесь решение load ...
.
И просто вставив Rake::Task['db:seed'].invoke
в test_helper, получилось:
Don't know how to build task 'db:seed' (RuntimeError)
Но когда мы добавили load_tasks до этого, он работал:
MyApp::Application.load_tasks
Rake::Task['db:seed'].invoke
Ответ 7
Добавление Rake::Task["db:seed"].invoke
в задачу db:test:prepare
rake не помогло мне. Если я подготовил базу данных с помощью rake db:test:prepare
, а затем вошел в консоль в тестовой среде, все мои семена были там. Однако семена не сохранялись между моими испытаниями.
Добавление load "#{Rails.root}/db/seeds.rb"
к моему методу настройки отлично работало.
Мне бы хотелось, чтобы эти семена загружались автоматически и сохранялись, но я еще не нашел способ сделать это!