【发布时间】:2011-05-04 16:12:34
【问题描述】:
我正在使用 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::错误:保存点 active_record_1 不存在: 回滚到保存点 active_record_1
然后我尝试在 setup 方法中调用 db:test:prepare 和 db:fixtures:load 但这也失败了。此外,由于 setup 方法在文件中的每个测试之前运行,它会大大降低测试速度,不是吗?
那么我怎样才能在特定的测试套件或测试文件(不知道如何调用它)之前运行那些 rake 任务,并且只针对那个?
谢谢! :)
【问题讨论】:
-
请多解释一下您要测试的内容。也许有比调用 rake 任务更好(更快)的测试方法。
-
好的。具体来说,我想测试 lib/file_i_want_to_test.rb 中的一些方法。这些方法由我们定义的 rake 任务调用。该任务从一个表(我们称之为父表)中收集数据,对该数据进行一些计算,然后填充 child_table1。现在它从 child_table1 收集数据,进行计算并填充 child_table2...,依此类推,直到 child_tableN。我可以“”“修复”“”它改变表的 auto_increment id,但它很糟糕。无论如何,谢谢。
标签: ruby-on-rails testing rake rake-task