Как загрузить 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" к моему методу настройки отлично работало.

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