【问题标题】:Run a specific rake test before running a specific test in RAILS在 RAILS 中运行特定测试之前运行特定的 rake 测试
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多