我有一个配置,除了本地 postgresql 数据库,我的 Rails 应用程序还访问远程 AWS 数据库。我的问题是,即使在不涉及远程数据库的测试中,应用程序每次都会建立与远程数据库的连接,所以我的测试运行缓慢。
是否有一种干净的方法可以禁用对不需要它的 rspec 测试的远程数据库服务器的访问?(并为那些确实需要它的测试启用它?)
我能想到的最好的方法是将我的 rspec 测试分成两个独立的部分——不需要访问远程数据库的部分和需要访问远程数据库的部分——并使用环境变量相应地启用或禁用 config/database.yaml 的部分.
为了清楚起见,我的config/database.yaml
文件包含(部分):
# file: config/database.yaml
# Define connections to the external database
remote:
adapter: mysql
database: remote
username: <%= ENV['PRODUCTION_DB_USERNAME'] || 'root' %>
password: <%= ENV['PRODUCTION_DB_PASSWORD'] || '' %>
host: awsserver-production-mysql.abcdef1234567890.us-west-2.rds.amazonaws.com
port: 3306
test:
adapter: postgresql
encoding: unicode
database: MyApp_test
pool: 5
username: <%= ENV['POSTGRESQL_DB_USERNAME'] || 'MyApp' %>
password: <%= ENV['POSTGRESQL_DB_PASSWORD'] || '' %>
(注意:如果您想知道,使用模拟不会有帮助:甚至在测试开始运行之前就建立了远程数据库连接。而且 vcr 只拦截 HTTP 连接——数据库连接使用不同的机制。)
更新
我找到了如何动态建立连接的示例:
def connect_to_myapp_database
ActiveRecord::Base.establish_connection(:adapter => "mysql",
:database => 'myapp',
:username => ENV['MYAPP_DB_USERNAME'],
:password => ENV['MYAPP_DB_PASSWORD'],
:host => 'mayapp-mysql.abcdefg123456.us-west-2.rds.amazonaws.com',
:port => 3306,
)
end
效果很好——我可以使用它来连接到外部数据库,只是为了那些需要它的测试。但这引出了一个问题:完成此操作后,如何断开与外部数据库的连接?