TL;DR:Verwenden Sie nulldb und eine testfähige Elternklasse
Verwenden Sie beim Testen nulldb und ansonsten die echte db. So geht's:
Fügen Sie dies zuerst in Ihr Gemfile ein:
group :development, :test do
gem 'activerecord-nulldb-adapter', :git => 'git://github.com/nulldb/nulldb.git'
end
und führen Sie dann die übliche bundle install
durch
Definieren Sie eine Basisklasse für alle Modelle, die in der externen Datenbank gesichert sind:
class ExternalModel < ActiveRecord::Base
if Rails.app.test?
establish_connection(:adapter => :nulldb)
else
establish_connection(:myapp)
end
def readonly?; true; end
end
Dann erben alle externen Modelle von ExternalModel (ich hätte das von Anfang an tun sollen):
class ExternalUser < ExternalModel
...
end
Wenn es in einer Testumgebung ausgeführt wird, versucht es nicht, eine Verbindung zur externen Tabelle herzustellen. Natürlich schlagen Versuche fehl, auf eine Instanz von ExternalUser zuzugreifen, aber Sie können während des Integrationstests selektiv eine Verbindung mit der externen Datenbank herstellen oder ansonsten Verweise auf das externe Modell stubben oder simulieren.
Am wichtigsten ist, dass alle meine Tests jetzt sehr schnell laufen.