TL;DR :utilisez nulldb et une classe parent compatible avec les tests
Utilisez nulldb lorsque vous testez et la vraie base de données sinon. Voici comment :
Tout d'abord, incluez ceci dans votre Gemfile :
group :development, :test do
gem 'activerecord-nulldb-adapter', :git => 'git://github.com/nulldb/nulldb.git'
end
puis effectuez l'bundle install
habituelle
Définissez une classe de base pour tous les modèles sauvegardés dans la base de données externe :
class ExternalModel < ActiveRecord::Base
if Rails.app.test?
establish_connection(:adapter => :nulldb)
else
establish_connection(:myapp)
end
def readonly?; true; end
end
Ensuite, tous les modèles externes héritent de ExternalModel (j'aurais dû le faire dès le début) :
class ExternalUser < ExternalModel
...
end
Lorsqu'il est exécuté dans un environnement de test, il n'essaie pas de se connecter à la table externe. Bien sûr, les tentatives d'accès à une instance de ExternalUser échoueront, mais vous pouvez établir une connexion sélective avec la base de données externe pendant les tests d'intégration, ou remplacer ou simuler des références au modèle externe dans le cas contraire.
Plus important encore, tous mes tests s'exécutent très rapidement maintenant.