Mysql
 sql >> Database >  >> RDS >> Mysql

La mia app accede a un database remoto. Come posso eseguire gli unit test in modo efficiente?

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.