我正在使用rails提供的内置单元测试功能测试应用程序。问题是一次测试很大程度上取决于使用id的计算,我们必须测试它。由于活动记录在回滚交易时没有重置auto_increment,我们在这里遇到了一些麻烦。
如果有办法重置所有数据库表并再次加载灯具,就好像我只运行了那个测试一样,可以解决问题。
首先,我尝试定义一个设置方法,以这种方式重置所有必需的auto_increment值:
def setup
ActiveRecord::Base.connection.execute("ALTER TABLE 'table_name1' AUTO_INCREMENT = 1;")
ActiveRecord::Base.connection.execute("ALTER TABLE 'table_name2' AUTO_INCREMENT = 1;")
end
但测试失败了这个丑陋的错误:
的ActiveRecord :: StatementInvalid: Mysql ::错误:SAVEPOINT active_record_1不存在: ROLLBACK TO SAVEPOINT active_record_1
然后我尝试调用db:test:prepare和db:fixtures:在setup方法中加载但是这也失败了。此外,由于在文件中的每个测试之前运行设置方法,它会大大减慢测试速度,不是吗?
那么我怎样才能在特定的测试套件或测试文件(不知道如何调用它)之前运行那些rake任务并且只针对那个?
谢谢! :)
答案 0 :(得分:2)
您应该能够删除测试数据库,然后运行rake db:create RAILS_ENV=test
以在测试中重新创建数据库。但是,如果你在测试过程中这样做,你还需要使用有效数据重新种子数据库,这可能是屁股的主要痛苦,如果这是你想要的路线。
您还应该能够使用迁移中的“drop_table:table_name”来完成此操作。
HOWEVER ,您的测试不应该以这种方式编写,您的数据库也不应该以这种方式构建,它们依赖于特定的DB ID。您的测试也不应该重新创建整个表只是为了重置AUTO_INCREMENT值。这几乎肯定表明您没有按照设计使用的方式使用测试套件工具。但是,我也认识到这不是一个完美的世界,我希望这是一种不寻常的边缘情况。 :S
答案 1 :(得分:0)
您可以使用database_cleaner宝石。然后在您的database_cleaner.rb上,您可以指定:pre_count
和:reset_ids
来重置您的ID。我建议您也为测试环境使用单独的数据库。