Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mon application accède à une base de données distante. Comment exécuter efficacement les tests unitaires ?

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.