CircleCI运行Ruby on Rails自动化测试提示表不存在如何解决?
问题修复方案
你的报错存在两个核心问题,按以下步骤修改即可解决:
1. 修复数据库名带-1后缀找不到的问题
这个后缀是Rails 6+默认开启的并行测试功能的特性:Rails会为每个并行测试worker自动分配带-数字后缀的独立数据库,你目前的配置只会创建基础的saving_test库,不会自动创建并行测试需要的带后缀库。
对应修改点:
(1)修正database.yml的test配置
你当前的test配置没有继承default块,还存在密码不匹配的问题,修改test块内容:
test: <<: *default database: saving_test password: <%= ENV.fetch("MYSQL_PASSWORD", "") %>
(2)修正CircleCI配置里的MySQL环境变量
CircleCI的MySQL镜像使用官方变量规则,你写的MYSQL_DB无效,改成正确的MYSQL_DATABASE:
- image: circleci/mysql:5.7 environment: - MYSQL_ALLOW_EMPTY_PASSWORD: 'true' - MYSQL_DATABASE: saving_test
(3)替换数据库初始化命令
把test job里的Database Setup步骤的命令替换为rails db:test:prepare,这个命令会自动处理并行测试需要的所有数据库创建、schema加载逻辑,无需手动分步执行:
- run: name: Database Setup command: bundle exec rails db:test:prepare RAILS_ENV=test
如果你不需要并行测试,也可以在test/test_helper.rb中添加配置关闭并行,就不会生成带后缀的数据库:
parallelize(workers: 1)
2. 修复patienecs表不存在的问题
这个是Rails对Patience这个词的复数变形识别错误导致的,两种修复方案二选一:
方案1:手动指定模型表名
在Patience模型中添加表名声明:
class Patience < ApplicationRecord self.table_name = "patiences" # 手动指定正确表名 belongs_to :user validates :user_id, presence: true validates :memo,length: { maximum: 140 } end
方案2:添加自定义变形规则
在config/initializers/inflections.rb中添加变形规则,全局生效:
ActiveSupport::Inflector.inflections(:en) do |inflect| inflect.irregular 'patience', 'patiences' end
修改后先在本地确认测试可以正常运行,再推送到CircleCI执行即可。
内容的提问来源于stack exchange,提问作者hime_chann____
相关产品推荐
相关产品推荐

