如何禁止RSpec运行数据库迁移 避免测试库数据表被误删
阻止RSpec运行时改动SQL Server测试库表结构的配置方案
问题根源是Rails测试环境默认开启schema自动维护逻辑,搭配部分测试清理策略会触发表结构重置,迁移文件为空时就会自动删除手动建好的数据表,按以下步骤配置即可解决:
关闭测试环境的schema自动维护能力
打开项目下的config/environments/test.rb文件,在配置块中添加如下配置,禁止Rails在测试启动时自动校验迁移版本、加载schema文件重置表结构:Rails.application.configure do # 其他原有配置保持不变 config.active_record.maintain_test_schema = false # 可选加固:禁止Active Record自动导出、同步schema结构,避免空迁移覆盖现有表定义 config.active_record.schema_format = :none end调整测试数据清理策略,禁用删表类操作
如果你的项目使用database_cleanergem做测试数据隔离,打开spec/rails_helper.rb(旧版Rails项目为spec/spec_helper.rb),找到RSpec配置块:- 删除
before(:suite)块中类似DatabaseCleaner.clean_with(:truncation)、DatabaseCleaner.clean_with(:deletion)的代码,这类全表清理逻辑容易在schema异常时触发表删除 - 将默认清理策略改为事务回滚模式,只会清理测试产生的数据,不会改动表结构:
RSpec.configure do |config| # 其他原有配置保持不变 config.before(:suite) do DatabaseCleaner.strategy = :transaction end end- 删除
日常操作避坑
不要手动执行rails db:test:prepare、rails db:migrate RAILS_ENV=test这类会自动重建测试库结构的命令,这类命令会读取迁移文件重新建表,在迁移为空的情况下会直接清空所有自定义表。
配置完成后可以先执行一个无数据库操作的简单用例验证,跑完后登录SQL Server检查测试库的表结构,确认没有被删除或改动即可。
内容的提问来源于stack exchange,提问作者marrnj2
相关产品推荐
相关产品推荐

