Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Meine App greift auf eine entfernte Datenbank zu. Wie führe ich Komponententests effizient durch?

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.