如何在测试之前阻止rspec删除测试数据库

时间:2016-10-25 11:08:20

标签: ruby-on-rails rspec

我有两个使用相同数据库的Rails应用程序。一个应用程序通过迁移管理数据库,但另一个只是访问它。

出于某种原因,当我在不管理数据库的应用程序中使用RSpec运行测试时,它会在运行测试之前删除数据库。但是因为这个应用程序不知道如何重新创建数据库所有测试都会失败。

如何告诉RSpec不要丢弃数据库,只是按原样使用它?

2 个答案:

答案 0 :(得分:9)

如果您不需要迁移数据库,则可以重新定义rspecs-rails spec:prepare这样的任务:

lib/tasks/patch_rspec_rails.rb

Rake::Task["spec:prepare"].clear
namespace :spec do
  task :prepare do
    ENV['RACK_ENV'] = ENV['RAILS_ENV'] = 'test'
  end 
end

原始spec:prepare任务调用test:prepare,它设置数据库。

Rails 4.0(或可能更早)以来,任务test:prepare已存在。此任务也存在于Rails 5.0中。这是一个用于添加依赖于测试的设置的轨道的钩子。您可以使用rake -W test:prepare检查其定义。那 您可以使用rake --trace spec检查任务。

ActiveRecord uses this task检查迁移状态并设置db。

如果未调用此任务,则不会删除或创建数据库。

但请注意,当其他某个gem使用test:prepare作为钩子插入测试时,它将无效。

编辑:

自Rails 4.1起,您可以在config.active_record.maintain_test_schema = false内设置config/environments/test.rb。这样Rails就不再尝试迁移您的测试模式。

答案 1 :(得分:3)

理想情况下,RSpec应重新初始化数据库以进行测试,以确保您的环境处于可靠,可预测的状态。

你可以做的是没有管理数据库的Rails应用程序执行rake db:schema:dump生成schema.rb然后由RSpec使用 - 当然要确保你的database.yml测试配置没有指向您的实时数据库。

我知道这在技术上并不是您问题的解决方案,但它应该可以防止导致您的测试失败的潜在问题。