ruby-on-rails - 使用特定的 RAILS_ENV 进行单个单元测试

标签 ruby-on-rails ruby ruby-on-rails-3 unit-testing testing

我想编写一个特定的测试来检查回归。我继承了一个没有单元测试的 Rails 环境,并且几乎没有防范通过外部(Rails 之外)方式将内容放入数据库的措施。

单元测试将遍历数据库中的特定模型并呈现 View ,确保每个实例仍然可以在该 View 中正确呈现。我想针对通常是生产数据库 (mysql) 的克隆的开发数据库实例运行它。

数据太大,无法放入 fixtures...我想使用“test”sqlite 数据库保留其余测试。

那么 - 有没有办法覆盖 Rails 连接到数据库的单个测试?

我正在使用 Rails 3.2.22。

编辑:

基于 Babar's answer ,我正在使用:

class MyTest < ActionController::TestCase

  def setup                                                                     
    @controller = MyController.new                                       
  end                                                                           

  test "should successfully render all" do                            
    begin                                                                       
      connection_config = ActiveRecord::Base.connection_config()                
      ActiveRecord::Base.establish_connection('development')                    
      MyModel.find_each do |i|                                        
        print "#{i.id} - #{i.name}\n"                           
        get(:show, {'name' => i.name})                                  
      end                                                                       
    ensure                                                                      
      ActiveRecord::Base.establish_connection(connection_config)                
      # or ActiveRecord::Base.establish_connection(ENV['RAILS_ENV'])                
    end                                                                         
  end                                                                           
end      

但我在尝试回滚时遇到异常。我假设这是因为测试最初是围绕事务进行的,并且由于我交换了数据库,连接现在已关闭,我们不再真正处于事务中。

最直接的解决方法是什么?

编辑:

添加这个看起来是最直接的:

  def setup                                                                     
    @controller = DashboardController.new                                       
    @use_transactional_fixtures = false                                         
  end                                                                           

最佳答案

有一个名为establish_connection 的类方法可以做你想做的事。只需在使用 ActiveRecord::Base.establish_connection 运行该特定测试时连接到不同的数据库。

ActiveRecord::Base.establish_connection(
  :adapter  => "mysql",
  :host     => "localhost",
  :username => "myuser",
  :password => "mypass",
  :database => "somedatabase"
)

您可以使用 database.yml 文件中的数据库别名。它会是这样的:

ActiveRecord::Base.establish_connection('development')

您可以将其直接编码到您的特定测试文件中。

查看文档:http://apidock.com/rails/v3.2.1/ActiveRecord/Base/establish_connection/class

关于ruby-on-rails - 使用特定的 RAILS_ENV 进行单个单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34639020/

相关文章:

ruby-on-rails - Rails 查询以子项总和为条件

ruby-on-rails - 将 Flash 消息呈现为 JSON 响应的 Rails DRY 机制

ruby - 葫芦-iOS : stack level too deep (SystemStackError) error is encountered each time an assertion is failing

ruby-on-rails - 保存时出现 ActiveRecord::RecordNotSaved 错误

ruby-on-rails - 在 Rails 中存储(结构化)配置数据的位置

ruby-on-rails - Rails 中基于角色的属性安全机制

mysql - 如何在 Ruby 1.9.2 + Rails3 中将表数据导出为 CSV 文件?

ruby-on-rails - 在每次 rake 执行之前调用的通用方法

ruby-on-rails - 我的 ubuntu 系统在启动 Elasticsearch 服务时卡住了

ruby - Watir-Webdriver 是否支持点击目标为 javascript 的链接?