TL;DR:Använd nulldb och en testmedveten överordnad klass
Använd nulldb när du testar och den riktiga db annars. Så här gör du:
Inkludera först detta i din Gemfile:
group :development, :test do
gem 'activerecord-nulldb-adapter', :git => 'git://github.com/nulldb/nulldb.git'
end
och gör sedan den vanliga bundle install
Definiera en basklass för alla modeller som backas upp i den externa databasen:
class ExternalModel < ActiveRecord::Base
if Rails.app.test?
establish_connection(:adapter => :nulldb)
else
establish_connection(:myapp)
end
def readonly?; true; end
end
Sedan ärver alla externa modeller från ExternalModel (jag borde ha gjort detta från början):
class ExternalUser < ExternalModel
...
end
När den körs i en testmiljö försöker den inte ansluta till den externa tabellen. Naturligtvis kommer försök att få åtkomst till en instans av ExternalUser att misslyckas, men du kan selektivt upprätta en anslutning till den externa databasen under integrationstestning, eller på annat sätt stubba eller låtsasreferenser till den externa modellen.
Viktigast av allt är att alla mina test går riktigt fort nu.