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

Mik*_*ika 6 rspec ruby-on-rails

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

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

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

slo*_*k2k 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
Run Code Online (Sandbox Code Playgroud)

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

该任务test:prepareRails 4.0(或可能更早)以来就存在.此任务也存在于Rails 5.0中.这是一个用于添加依赖于测试的设置的铁路的钩子.你可以用它来检查它的定义rake -W test:prepare.任务被击中你可以检查rake --trace spec.

ActiveRecord使用此任务来检查迁移状态并设置db.

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

但请注意,当其他一些宝石test:prepare用作钩子时,也会插入测试中,它将无法正常工作.

编辑:

从Rails 4.1开始,您可以config.active_record.maintain_test_schema = false在其中进行设置config/environments/test.rb.这样Rails就不应该再尝试迁移您的测试模式.

  • 由于 Rails 4 或更早版本,任务 `test:prepare` 作为钩子存在 (https://github.com/rails/rails/blob/4-0-stable/railties/lib/rails/test_unit/testing.rake#L66 )。在 Rails 5 中也存在这个任务(rake -W test:prep)。ActiveRecord 通过检查挂起的迁移来扩展此任务 (https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/railties/databases.rake#L360)。在此任务中,也会发生下降。当没有调用`test:prepare` 时,不会删除或创建任何数据库。您必须确保测试数据库存在,但这是一个问题。 (2认同)
  • 注释掉ActiveRecord :: Migration.maintain_test_schema!帮助。 (2认同)