TL;DR:Użyj nulldb i klasy nadrzędnej obsługującej testy
Użyj nulldb podczas testowania, a rzeczywistej bazy danych w przeciwnym razie. Oto jak:
Najpierw umieść to w swoim pliku Gemfile:
group :development, :test do
gem 'activerecord-nulldb-adapter', :git => 'git://github.com/nulldb/nulldb.git'
end
a następnie wykonaj zwykłą bundle install
Zdefiniuj klasę bazową dla wszystkich modeli znajdujących się w zewnętrznej bazie danych:
class ExternalModel < ActiveRecord::Base
if Rails.app.test?
establish_connection(:adapter => :nulldb)
else
establish_connection(:myapp)
end
def readonly?; true; end
end
Następnie wszystkie modele zewnętrzne dziedziczą po ExternalModel (powinienem był to zrobić od samego początku):
class ExternalUser < ExternalModel
...
end
Po uruchomieniu w środowisku testowym nie będzie próbował połączyć się z tabelą zewnętrzną. Oczywiście próby uzyskania dostępu do instancji ExternalUser zakończą się niepowodzeniem, ale możesz selektywnie nawiązać połączenie z zewnętrzną bazą danych podczas testowania integracji lub w przeciwnym razie skrótowe lub próbne odwołania do modelu zewnętrznego.
Co najważniejsze, wszystkie moje testy przebiegają teraz naprawdę szybko.