【问题标题】:Use specific RAILS_ENV for a single unit test对单个单元测试使用特定的 RAILS_ENV
【发布时间】:2016-01-06 17:25:40
【问题描述】:

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

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

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

【问题讨论】:

  • 你在使用Minitest吗?规格?还有什么?我假设您希望此测试始终使用此特定环境,而不仅仅是在命令行中执行 RAILS_ENV=[x] 一次?
  • 我希望这个特定的测试始终使用特定的环境,无论 RAILS_ENV 设置为什么。 ...实际上我的 test_helper.rb 设置了ENV["RAILS_ENV"] = "test",所以我相信 RAILS_ENV 不能在命令行上被覆盖? (我同意。)
  • 我的 Gemfile 中似乎有 rspec 2.14.1,但我认为我使用的是 minitest——测试类派生自 Test::Unit::TestCase、ActiveSupport::TestCase、ActionView: :TestCase, ActionController::TestCase

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


【解决方案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

【讨论】:

  • 认真的吗?就这样?我找了好几天了!非常感谢!与您的回答同时,我还发现了makandracards.com/makandra/…,它还显示了确保回退到默认值。我认为这是必要的?
  • 我收到回滚错误,但我认为这可能是因为我是从 ActionController::TestCase 派生的。 Test::Unit::TestCase 工作正常。不过,我可能需要其他测试类之一来模拟页面呈现?
  • 我更喜欢规范而不是测试!抱歉无法回答。
  • 我已接受此答案,但请注意,我已在问题中添加了解决方法,以处理由 rails 测试框架围绕测试包装的事务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 2015-01-07
  • 2018-08-31
  • 2012-10-01
相关资源
最近更新 更多