我有两个使用相同数据库的Rails应用程序。一个应用程序通过迁移管理数据库,但另一个只是访问它。
出于某种原因,当我在不管理数据库的应用程序中使用RSpec运行测试时,它会在运行测试之前删除数据库。但是因为这个应用程序不知道如何重新创建数据库所有测试都会失败。
如何告诉RSpec不要丢弃数据库,只是按原样使用它?
答案 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测试配置没有指向您的实时数据库。
我知道这在技术上并不是您问题的解决方案,但它应该可以防止导致您的测试失败的潜在问题。