TL;DR:usa nulldb e una classe genitore sensibile ai test
Usa nulldb quando stai testando e il vero db in caso contrario. Ecco come:
Innanzitutto, includilo nel tuo Gemfile:
group :development, :test do
gem 'activerecord-nulldb-adapter', :git => 'git://github.com/nulldb/nulldb.git'
end
e poi esegui la consueta bundle install
Definisci una classe base per tutti i modelli supportati nel database esterno:
class ExternalModel < ActiveRecord::Base
if Rails.app.test?
establish_connection(:adapter => :nulldb)
else
establish_connection(:myapp)
end
def readonly?; true; end
end
Quindi tutti i modelli esterni ereditano da ExternalModel (avrei dovuto farlo dall'inizio):
class ExternalUser < ExternalModel
...
end
Quando viene eseguito in un ambiente di test, non tenterà di connettersi alla tabella esterna. Naturalmente, i tentativi di accesso a un'istanza di ExternalUser non andranno a buon fine, ma è possibile stabilire selettivamente una connessione con il database esterno durante il test di integrazione, oppure stub o falsificare i riferimenti al modello esterno in caso contrario.
Ancora più importante, tutti i miei test ora funzionano molto velocemente.