Ответ 1
В зависимости от того, как настроен ваш файл семени, вы можете просто загрузить/запустить его из блока before(:each)
или before(:all)
:
load Rails.root + "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
Что может сделать лучший способ сделать это? Спасибо.
В зависимости от того, как настроен ваш файл семени, вы можете просто загрузить/запустить его из блока 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
, чтобы пропустить шаг семени и избежать ненужной перезагрузки. Я настраиваю очиститель базы данных, чтобы игнорировать таблицы семян следующим образом:
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
.
Чтобы загрузить семена в rspec, вам нужно добавить его после очистки базы данных в confg.before(: suite) в spec_helper
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
load "#{Rails.root}/db/seeds.rb"
end
В 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
Я думаю, мы должны использовать
config.before(:each) do
Rails.application.load_seed # loading seeds
end
as before (: all) запускает блок за один раз до запуска всех примеров.
Итак, если мы используем before :all
, семенные данные будут очищены.
скопируйте файл seed.rb внутри папки config/initializers. Таким образом, файл seed.rb будет запущен при запуске сервера.
Запустите команду ниже, чтобы заполнить тестовый db данными seed.rb.
RAILS_ENV = test rake db: seed