Я настроил задачу 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
.