在RAILS中运行特定测试之前运行特定的rake测试

时间:2011-05-04 16:12:34

标签: ruby-on-rails testing rake rake-task

我正在使用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任务并且只针对那个?

谢谢! :)

2 个答案:

答案 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。我建议您也为测试环境使用单独的数据库。

相关问题