0

我正在使用 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::Error: SAVEPOINT active_record_1 不存在: ROLLBACK TO SAVEPOINT active_record_1

然后我尝试在 setup 方法中调用 db:test:prepare 和 db:fixtures:load 但这也失败了。此外,由于 setup 方法在文件中的每个测试之前运行,它会大大降低测试速度,不是吗?

那么如何在特定的测试套件或测试文件(不知道如何调用它)之前运行那些 rake 任务,并且只针对那个?

谢谢!:)

4

2 回答 2

2

您应该能够删除您的测试数据库,然后运行rake db:create RAILS_ENV=test以从测试中重新创建数据库。但是,如果您在测试过程中这样做,您还需要使用有效数据重新播种数据库,如果这是您想要采取的路线,这可能是一个很大的麻烦。

您还应该能够使用迁移中的“drop_table :table_name”内容来执行此操作。

但是,您的测试不应该以这种方式编写,您的数据库也不应该以这种方式构建,它们依赖于特定的数据库 ID。您的测试也不应该仅仅为了重置 AUTO_INCREMENT 值而重新创建整个表。这几乎肯定表明您没有按照设计使用的方式使用测试套件工具。但是,我也认识到这不是一个完美的世界,我希望这是某种不寻常的边缘情况。:S

于 2011-05-04T16:45:17.077 回答
0

您可以使用database_cleaner gem。然后在您的 database_cleaner.rb 上,您可以指定:pre_count:reset_ids重置您的 ID。我建议也为您的测试环境使用单独的数据库。

于 2015-12-31T15:22:51.673 回答