2009-10-15 7 views
111

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

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

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

ответ

108

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

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

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

+4

Я обожаю простоту, но почему-то добавление этой строки в мой 'test_helper.rb' не работало для меня, хотя http://stackoverflow.com/a/1998520/68210. –

+34

В новых версиях рельсов вы можете: Rails.application.load_seed – Steve

+0

@Steve спасибо - знаете ли вы, куда класть Rails.application.load_seed, если вы используете rspec/capybarra, например? – BKSpurgeon

3

Мы вызовом дб: семена как часть дб: тест: подготовка, с:

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

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

+4

Создал ли новый db: test: подготовить задачу сделать это? Можете ли вы опубликовать код? –

18

Положив что-то подобное в Lib/задач/test_seed.rake должен вызвать задачу семян после дб: тест: нагрузка:

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

Я бы сказал, что это должно быть

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

Поскольку дб: тест: нагрузка не выполняется, если у вас есть config.active_record.schema_format =: SQL (дБ: тест: clone_structure есть)

+4

Запуск rake с '--trace' помог мне понять, как это работает. –

+0

В какой файл это входит? – BookOfGreg

+4

@BookOfGreg У меня есть это в lib/tasks/test_seed.rake, который я создал сам –

2

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

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

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

3

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

Я считаю Steve's comment выше должен быть правильный ответ. Вы можете использовать Rails.application.load_seed для загрузки данных семян в тестовую среду.Однако, когда и как часто эти данные загружен, зависят от нескольких вещей:

Использования MiniTest

Там нет удобного способа запустить этот файл один раз, прежде чем все испытания (см this Github issue). Вам необходимо загрузить данные, когда перед каждым испытанием, скорее всего, в способе установки ваших тестовых файлов:

# test/models/my_model_test.rb 
class LevelTest < ActiveSupport::TestCase 

    def setup 
    Rails.application.load_seed 
    end 

    # tests here... 

end 

Использование RSpec

before(:all) метод

Используйте RSpec для загрузки начальных данных для всех испытаний для этой модели :

describe MyModel do 
    before(:all) do 
    Rails.application.load_seed 
end 

describe "my model..." do 
    # your tests here 
end 

Надеюсь, что это поможет.

+2

Лучший ответ до сих пор –