Автоматически загружать данные семян из db / seeds.rb с помощью граблей - PullRequest
20 голосов
/ 05 декабря 2011

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

bundle exec rake

все проверено. Однако я хотел бы улучшить свои спецификации, заполнив некоторые данные (из db / seed.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

Что может быть лучшим способом сделать это? Благодаря.

Ответы [ 7 ]

44 голосов
/ 05 декабря 2011

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

29 голосов
/ 05 декабря 2011

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

load Rails.root + "db/seeds.rb" 
12 голосов
/ 28 сентября 2012

Я настроил задачу rake spec на автоматическую загрузку db / seed.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.

7 голосов
/ 03 марта 2015

В 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 голосов
/ 07 ноября 2013

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

config.before(:suite) do
  DatabaseCleaner.clean_with(:truncation)
  load "#{Rails.root}/db/seeds.rb" 
end
0 голосов
/ 05 декабря 2017
  1. скопировать файл seed.rb в папку config / initializers. Таким образом, файл seed.rb будет выполнен при запуске сервера.

  2. Запустите приведенную ниже командузаполнить тестовую базу данных данными seed.rb

    RAILS_ENV = тестовая база данных rab: seed

0 голосов
/ 13 сентября 2016

Я думаю, что мы должны использовать

config.before(:each) do
  Rails.application.load_seed # loading seeds
end

как до того, как (: all) запустит блок один раз перед запуском всех примеров.

Так что еслимы используем before :all, начальные данные будут очищены.

...