Автоматическая загрузка данных семян из db / seeds.РБ с граблями
Я использую rails-rspec камень и у меня есть несколько спецификаций (модели, контроллеры и т. д.).  Когда я бегу:
bundle exec rake
все проверяется. Тем не менее, я хотел бы улучшить свои спецификации, заполнив некоторые данные (из db/seeds.rb) сразу после создания базы данных (в тестовой среде).
мой спец/spec_helper.файл RB выглядит так:
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'capybara/rspec'
require 'ruby-debug'
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
  config.mock_with :rspec
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = false
  config.include SpecHelper
  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.clean_with(:truncation)
  end
  config.before(:each) do
    DatabaseCleaner.start
    stub_xmpp_rest_client!  
  end
  config.after(:each) do
    DatabaseCleaner.clean
  end
  config.include Devise::TestHelpers, :type => :controller
  config.include Delorean
  config.after(:each) { back_to_the_present }
  config.include Factory::Syntax::Methods
  config.extend ControllerMacros, :type => :controller
end
что может сделать лучший способ сделать это? Спасибо.
7 ответов
В зависимости от того, как настроен ваш семенной файл, вы можете просто загрузить/запустить его из before(:each) или before(:all) блок:
load Rails.root + "db/seeds.rb" 
плохая идея! Никогда, никогда не засевайте свою тестовую базу данных. Используйте фабрики для создания, в каждом тесте,только записи, необходимые для прохождения этого теста. Заполнение тестовой базы данных сделает ваши тесты менее надежными, потому что вы будете делать много предположений, которые явно не указаны в ваших тестах.
Я создал свой rake spec задача для автоматической загрузки db / seeds.rb, поэтому я полагаюсь на это для настройки базы данных для первого запуска. Добавьте это в свой Rakefile:
task :spec     => "db:seed"
task :cucumber => "db:seed"
затем, при последующих запусках я просто вызываю rspec spec сразу пропустить шаг семени и избежать ненужной перезагрузки. Я настраиваю database cleaner, чтобы игнорировать таблицы seed следующим образом:
RSpec.configure do |config|
  config.add_setting(:seed_tables)
  config.seed_tables = %w(countries roles product_types)
  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation, except: config.seed_tables)
  end
  config.around(:each) do |example|
    if example.metadata[:no_transactions]
      DatabaseCleaner.strategy = :truncation, {except: config.seed_tables}
    else
      DatabaseCleaner.strategy = :transaction
    end
    DatabaseCleaner.start
    example.run
    DatabaseCleaner.clean
  end
end
для сценариев, которые нуждаются в фиксированных данных, я могу добавить:
describe "commit for real", use_transactions: false do
  # ...
end
это усечь все после выполнения примера, кроме таблиц seed. предполагается, что вы никогда ничего не пишете в таблицы семян! это, как правило, безопасное предположение, так как исходные данные обычно статичны.
для всех других нормальных сценариев я зависел от транзакций для отката любых вставленных записей. База данных возвращается в исходное состояние, при этом данные в исходных таблицах остаются нетронутыми. Безопасно писать в таблицы семян здесь, Если вам нужно.
восстановить таблицы семян, вам просто нужно запустить rake spec снова.
чтобы загрузить семена в rspec, вам нужно добавить его после очистки базы данных в confg.before (: suite) in spec_helper
config.before(:suite) do
  DatabaseCleaner.clean_with(:truncation)
  load "#{Rails.root}/db/seeds.rb" 
end
на рельсы 4.2.0 и RSpec 3.x, вот как мой rails_helper.РБ смотрит.
RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = false
  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end
  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end
  config.before(:each, :js => true) do
    DatabaseCleaner.strategy = :truncation
  end
  config.before(:each) do
    DatabaseCleaner.start
  end
  config.after(:each) do
    DatabaseCleaner.clean
  end
  config.before(:all) do
    Rails.application.load_seed # loading seeds
  end
end
скопировать семян.файл rb внутри папки config/initializers.Итак, семя.файл rb будет выполнен при запуске сервера.
- 
выполните приведенную ниже команду, чтобы заполнить тестовую БД семенем.данные
RAILS_ENV=тестовые грабли db: seed
 
Я думаю, что мы должны использовать
config.before(:each) do
  Rails.application.load_seed # loading seeds
end
as before (: all) запускает блок один раз перед запуском всех примеров.
Итак, если мы используем тег before :all, начальные данные будут очищены.