ruby-on-rails – 测试和建立连接
发布时间:2020-12-17 02:50:29 所属栏目:百科 来源:网络整理
导读:如何为模型中使用establish_connection连接到另一个数据库的项目编写测试? 解决方法 当您为某些模型建立connect_connection以连接到不同的数据库时,在测试这些表时您将面临的一个问题是您创建的测试数据不会自动回滚. 用于创建事务保存点并在rails / active
如何为模型中使用establish_connection连接到另一个数据库的项目编写测试?
解决方法
当您为某些模型建立connect_connection以连接到不同的数据库时,在测试这些表时您将面临的一个问题是您创建的测试数据不会自动回滚.
用于创建事务保存点并在rails / activerecord / lib / active_record / fixtures.rb中回滚测试生命数据的实际代码.特别是有两种方法setup_fixtures和teardown_fixtures.这些方法中的代码很简单.它们只是创建一个保存点,并为每个测试进行回滚.但它仅适用于ActiveRecord :: Base连接. 所以你要做的就是“猴子补丁”这些方法,这样除了ActiveRecord :: Base连接之外,还为你的附加数据库连接完成了同样的操作. 以下是相同的示例代码: ## database.yml development: database: dev test: database: test #... my_connection_development: database: my_connection_dev my_connection_test: database: my_connection_test #... ## my_connection_base.rb class MyConnectionBase < ActiveRecord::Base establish_connection(ActiveRecord::Base.configurations["my_connection_#{RAILS_ENV}"]) self.abstract_class = true end ## my_model.rb class MyModel < MyConnectionBase end ## my_another_model.rb class MyAnotherModel < MyConnectionBase end ## test_case_patch.rb module ActiveSupport class TestCase def setup_fixtures return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank? if pre_loaded_fixtures && !use_transactional_fixtures raise RuntimeError,'pre_loaded_fixtures requires use_transactional_fixtures' end @fixture_cache = {} @@already_loaded_fixtures ||= {} # Load fixtures once and begin transaction. if run_in_transaction? if @@already_loaded_fixtures[self.class] @loaded_fixtures = @@already_loaded_fixtures[self.class] else load_fixtures @@already_loaded_fixtures[self.class] = @loaded_fixtures end ActiveRecord::Base.connection.increment_open_transactions ActiveRecord::Base.connection.transaction_joinable = false ActiveRecord::Base.connection.begin_db_transaction MyConnectionBase.connection.increment_open_transactions MyConnectionBase.connection.transaction_joinable = false MyConnectionBase.connection.begin_db_transaction # Load fixtures for every test. else Fixtures.reset_cache @@already_loaded_fixtures[self.class] = nil load_fixtures end # Instantiate fixtures for every test if requested. instantiate_fixtures if use_instantiated_fixtures end def teardown_fixtures return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank? unless run_in_transaction? Fixtures.reset_cache end # Rollback changes if a transaction is active. if run_in_transaction? && MyConnectionBase.connection.open_transactions != 0 MyConnectionBase.connection.rollback_db_transaction MyConnectionBase.connection.decrement_open_transactions end # Rollback changes if a transaction is active. if run_in_transaction? && ActiveRecord::Base.connection.open_transactions != 0 ActiveRecord::Base.connection.rollback_db_transaction ActiveRecord::Base.connection.decrement_open_transactions end MyConnectionBase.clear_active_connections! ActiveRecord::Base.clear_active_connections! end end end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |