Как загрузить db: seed data в тестовую базу данных автоматически?


Я пытаюсь использовать новый стандартный способ загрузки семенных данных в Rails 2.3.4+,db:seed задач рейка.

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

каков лучший способ получить db:seed задача для запуска перед тестами, поэтому данные предварительно заполнены?

7 113

7 ответов:

The db:seed грабли задача в первую очередь просто загружает db/seeds.rb сценарий. Поэтому просто выполните этот файл, чтобы загрузить данные.

load "#{Rails.root}/db/seeds.rb"

где разместить это зависит от того, какие рамки тестирования вы используете и хотите ли вы, чтобы он был загружен перед каждым тестом или только один раз в начале. Вы могли бы положить его в setup звонок или .

Я бы сказал, что он должен быть!--2-->

namespace :db do
  namespace :test do
    task :prepare => :environment do
      Rake::Task["db:seed"].invoke
    end
  end
end

потому что db:test: load не выполняется, если у вас есть конфигурация.активная запись.schema_format =: sql (db: test: clone_structure is)

помещая что-то вроде этого в lib/tasks/test_seed.рейк должен вызвать начальную задачу после db: test:load:

namespace :db do
  namespace :test do
    task :load => :environment do
      Rake::Task["db:seed"].invoke
    end
  end
end

Я считаю Стив комментария выше должен быть правильный ответ. Вы можете использовать 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

надеюсь, что это помогает.

мы вызываем db: seed как часть db: test: prepare, with:

Rake::Task["db:seed"].invoke

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

для тех, кто использует 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

добавлять Rake::Task["db:seed"].invoke до db:test:prepare грабли задача не работает для меня. Если я подготовил базу данных rake db:test:prepare, а затем вошел в консоль в тестовой среде, все мои семена были там. Однако семена не сохранялись между моими тестами.

добавлять load "#{Rails.root}/db/seeds.rb" чтобы мой метод настройки работал нормально, хотя.

Я хотел бы, чтобы эти семена загружались автоматически и сохранялись, но я еще не нашел способ сделать это!