对单个单元测试使用特定的 RAILS_ENV
Use specific RAILS_ENV for a single unit test
我想编写一个特定的测试来检查回归。我继承了一个没有单元测试的 Rails 环境,并且很少有人能防止通过外部(Rails 之外)方式将内容放入数据库。
单元测试将遍历数据库中的特定模型并呈现视图,确保每个实例仍然可以在该视图中正确呈现。我想 运行 针对开发数据库实例进行此操作,该实例通常是生产数据库的克隆 (mysql)。
数据太大,无法放入固定装置...我想使用 'test' sqlite 数据库保留其余测试。
那么 - 有没有办法覆盖数据库 Rails 连接到的单个测试?
我正在使用 Rails 3.2.22.
编辑:
基于,我正在使用:
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
的 class 方法可以做你想做的事。只需连接到不同的数据库,同时 运行 使用 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
我想编写一个特定的测试来检查回归。我继承了一个没有单元测试的 Rails 环境,并且很少有人能防止通过外部(Rails 之外)方式将内容放入数据库。
单元测试将遍历数据库中的特定模型并呈现视图,确保每个实例仍然可以在该视图中正确呈现。我想 运行 针对开发数据库实例进行此操作,该实例通常是生产数据库的克隆 (mysql)。
数据太大,无法放入固定装置...我想使用 'test' sqlite 数据库保留其余测试。
那么 - 有没有办法覆盖数据库 Rails 连接到的单个测试?
我正在使用 Rails 3.2.22.
编辑:
基于
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
的 class 方法可以做你想做的事。只需连接到不同的数据库,同时 运行 使用 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