【发布时间】: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