6

想知道是否有方法可以运行Rails测试而不丢失数据库。我目前只执行单元测试,并使用以下rake命令来执行此操作:rake test:units运行Rails测试而不丢弃测试数据库

感谢您的帮助!

以防万一,这是相关的:

  • 的Rails 3
  • 的Ruby 1.8.7(MRI)
  • 在Oracle 11g数据库
    • 的ActiveRecord-oracle_enhanced适配器

回答

2

在做了一些研究后,我发现没有办法做到这一点。即使在Bohdan提供的选项中提供选项时,测试rake任务将始终会丢失数据库。

通过使用--trace选项,可以证明这一点。下面是输出:

$ rake test:units TEST=test/unit/post_test.rb --trace 
(in /Users/johnnyicon/Development/ror/test-app) 
** Invoke test:units (first_time) 
** Invoke test:prepare (first_time) 
** Invoke db:test:prepare (first_time) 
** Invoke db:abort_if_pending_migrations (first_time) 
** Invoke environment (first_time) 
** Execute environment 
** Execute db:abort_if_pending_migrations 
** Execute db:test:prepare 
** Invoke db:test:load (first_time) 
** Invoke db:test:purge (first_time) 
** Invoke environment 
** Execute db:test:purge 
** Execute db:test:load 
** Invoke db:schema:load (first_time) 
** Invoke environment 
** Execute db:schema:load 
** Execute test:prepare 
** Execute test:units 

通过Ruby on Rails Guides for Testing阅读,它描述了其中的一些rake任务的意思。需要特别注意的是任务,你可以从输出的最下面看到第7行为** Execute db:test:load。导游说这个任务如下:

重新创建从 当前schema.rb测试数据库

所以,即使我是来执行单元测试逐一博赫丹所暗示的, rake任务仍然会重新创建数据库。不是我希望的答案,但它不再是问题。

我之所以要求开始的原因是因为我没有访问另一个数据库用于测试,所以我也使用我的开发数据库进行测试。但从那以后,我已经能够获得另一个专门用于测试的数据库。

无论如何感谢Bohdan!我感谢帮助!

+1

很高兴听到它。您的测试数据库*应该*在每次运行测试时被清除,否则您的测试将不准确。 – 2011-11-02 17:37:16

0

难道你不能写一个自定义Rake任务,猴子修补Rake数据库:测试:加载任务什么都不做?

0

对于那些寻找一种方式来跳过Rails的默认行为,你可以添加以下到您的Rake文件:

Rake::Task["db:test:prepare"].clear 
Rake::Task["db:test:load"].clear 
Rake::Task["db:test:purge"].clear 
+0

这是行不通的! – dariush 2017-05-20 18:25:35

1

在Rails 5(甚至更早的版本),只是注释掉以下行spec/rails_helper.rb

ActiveRecord::Migration.maintain_test_schema! 

这会阻止rake testrspec试图删除您的测试数据库。您还需要手动运行迁移。