TL;DR:Използвайте nulldb и родителски клас, който знае за тест
Използвайте nulldb, когато тествате, и реалния db в противен случай. Ето как:
Първо, включете това във вашия Gemfile:
group :development, :test do
gem 'activerecord-nulldb-adapter', :git => 'git://github.com/nulldb/nulldb.git'
end
и след това направете обичайната bundle install
Дефинирайте базов клас за всички модели, които се поддържат във външната база данни:
class ExternalModel < ActiveRecord::Base
if Rails.app.test?
establish_connection(:adapter => :nulldb)
else
establish_connection(:myapp)
end
def readonly?; true; end
end
Тогава всички външни модели наследяват от ExternalModel (трябваше да направя това от самото начало):
class ExternalUser < ExternalModel
...
end
Когато се изпълнява в тестова среда, той няма да се опитва да се свърже с външната таблица. Разбира се, опитите за достъп до екземпляр на ExternalUser ще бъдат неуспешни, но можете избирателно да установите връзка с външната база данни по време на интеграционно тестване или в противен случай заглушени или фалшиви препратки към външния модел.
Най-важното е, че всичките ми тестове вървят много бързо сега.