使用特定的RAILS_ENV进行单个单元测试

时间:2016-01-06 17:25:40

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

我有一个特定的测试我想写一下来检查回归。我继承了一个没有单元测试的Rails环境,并且很少有人通过外部(在Rails之外)的方式防止将数据放入数据库。

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

数据太大而无法放入灯具......我想使用'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                                                                           

1 个答案:

答案 0 :(得分:1)

有一个名为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