Подтвердить что ты не робот

Автоматическая загрузка данных семян из db/seeds.rb с помощью грабли

Я использую rails-rspec gem, и у меня есть несколько спецификаций (модели, контроллеры и т.д.). Когда я запускаю:

bundle exec rake

все протестировано. Тем не менее, я хотел бы улучшить свои спецификации, посеяв некоторые данные (из db/seeds.rb) сразу после создания базы данных (в тестовой среде).

Мой spec/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

Что может сделать лучший способ сделать это? Спасибо.

4b9b3361

Ответ 1

В зависимости от того, как настроен ваш файл семени, вы можете просто загрузить/запустить его из блока before(:each) или before(:all):

load Rails.root + "db/seeds.rb" 

Ответ 2

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

Ответ 3

Я установил свою задачу rake spec для автоматической загрузки db/seeds.rb, поэтому я полагаюсь на это для настройки базы данных для первого запуска. Добавьте это в свой файл Rakefile:

task :spec     => "db:seed"
task :cucumber => "db:seed"

Затем на последующих запусках я просто вызываю rspec spec, чтобы пропустить шаг семени и избежать ненужной перезагрузки. Я настраиваю очиститель базы данных, чтобы игнорировать таблицы семян следующим образом:

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

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

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

Чтобы перестроить таблицы семян, вам просто нужно снова запустить rake spec.

Ответ 4

Чтобы загрузить семена в rspec, вам нужно добавить его после очистки базы данных в confg.before(: suite) в spec_helper

config.before(:suite) do
  DatabaseCleaner.clean_with(:truncation)
  load "#{Rails.root}/db/seeds.rb" 
end

Ответ 5

В Rails 4.2.0 и RSpec 3.x выглядит так: rails_helper.rb.

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

Ответ 7

  • скопируйте файл seed.rb внутри папки config/initializers. Таким образом, файл seed.rb будет запущен при запуске сервера.

  • Запустите команду ниже, чтобы заполнить тестовый db данными seed.rb.

    RAILS_ENV = test rake db: seed