We currently have 2 databases for our application and I had a need to basically setup both databases, our test database, and another stats database.
I also noticed an issue where running rake spec wouldn’t run in the test environment, which we always wanted it to run it. My solution is the below (Note: We have a db_stats task that basically mimics all the calls of db):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
force_rspec_to_test_environment namespace :db do namespace :test do if db_test_prepare_task.present? task :prepare => db_test_prepare_task.prerequisites do Rake::Task['db:test:setup'].invoke end end desc "Setup test database - drops, loads schema, and migrates the test db" task :setup do if Rails.env.test? Rake::Task['db:drop'].invoke Rake::Task['db:create'].invoke ActiveRecord::Base.connection.execute("CREATE EXTENSION IF NOT EXISTS dblink;") Rake::Task['db:migrate'].invoke system("rake db_stats:drop RAILS_ENV=test") system("rake db_stats:create RAILS_ENV=test") SecondDatabaseModel.connection.execute("CREATE EXTENSION IF NOT EXISTS dblink;") system("rake db_stats:migrate RAILS_ENV=test") else system("rake db:test:setup RAILS_ENV=test") end end end end def force_rspec_to_test_environment unless Rails.env.test? rspec_task = Rake.application.instance_variable_get('@tasks')['spec'] Rake::Task["spec"].clear task :spec do system("rake spec RAILS_ENV=test") end end end def db_test_prepare_task return @db_test_prepare_task if @db_test_prepare_task.present? if Rails.env.test? @db_test_prepare_task = Rake.application.instance_variable_get('@tasks')['db:schema:load'] Rake::Task["db:schema:load"].clear end @db_test_prepare_task end |